본문 바로가기

멋쟁이사자처럼_부트캠프/Java

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 2일차 Java의 타입과 연산자, 반복문 그리고 조건문

Java에서 타입은 변수, 객체, 메서드 등의 데이터 종류와 크기를 정의. Java는 강타입 언어(Strongly Typed Language)이기 때문에 모든 변수와 표현식은 명확한 타입을 가져야 함.

    • 강타입 언어(Strongly Typed Language)란 변수나 값의 데이터 타입이 엄격하게 정의되고, 타입 간의 변환이 명확히 규제되는 언어를 의미.
    • 강타입 언어와 약타입 언어 비교
      특징 강타입 언어 약타입 언어
      타입 엄격성 타입 간 변환이 엄격 타입 변환이 자유로움
      타입 검사 시점 주로 컴파일 단계에서 검사 실행 단계에서 타입이 결정되거나 변환됨
      코드 안전성 타입 오류를 컴파일러가 감지 타입 오류가 실행 중 발생 가능
      예시 Java, C#, Swift, Kotlin Python, JavaScript, PHP, Ruby

 

Java 타입의 분류

Java 타입은 크게 두 가지로 나뉨:

  1. 기본 타입(Primitive Types)
    • 값 자체를 저장.
    • Java의 가장 기본적인 데이터 타입.
  2. 참조 타입(Reference Types)
    • 객체나 배열과 같은 데이터를 참조(주소)로 저장.

1. 기본 타입 (Primitive Types)

byte 1 byte 0 -128 ~ 127
short 2 bytes 0 -32,768 ~ 32,767
int 4 bytes 0 -2³¹ ~ 2³¹-1
long 8 bytes 0L -2⁶³ ~ 2⁶³-1
float 4 bytes 0.0f 소수점 7자리 정도
double 8 bytes 0.0d 소수점 15자리 정도
char 2 bytes \u0000 유니코드 문자
boolean 1 bit false true 또는 false

특징

  1. 메모리 효율적:
    • 메모리에 고정된 크기를 차지하며, 값 자체를 저장.
  2. 속도 빠름:
    • 참조 타입보다 연산 속도가 빠름.
  3. 기본값:
    • 변수 선언 후 초기화하지 않으면 위의 기본값으로 설정.

 


2. 참조 타입 (Reference Types)

참조 타입은 객체의 메모리 주소를 저장함. 실제 데이터는 힙(Heap) 영역에 저장되고, 참조 타입 변수는 힙 메모리를 참조.

참조 타입 종류

1. 클래스(Class):

  • 사용자 정의 객체를 생성.
  • 예: String, 사용자 정의 클래스 등.
 
String text = "Hello"; // 참조 타입

 

2. 인터페이스(Interface):

  • 클래스가 구현해야 할 메서드들의 집합.
List<Integer> list = new ArrayList<>();
3. 배열(Array):
  • 동일한 타입의 요소를 저장하는 자료구조.
int[] numbers = {1, 2, 3, 4, 5};
4. 열거 타입(Enum):
  • 상수 집합을 정의하는 특수 클래스.
enum Day { MONDAY, TUESDAY, WEDNESDAY }

특징

  1. 동적 데이터 관리:
    • 참조 타입은 힙 메모리를 사용하여 객체나 데이터를 동적으로 생성하고 관리.
  2. 기본값:
    • 참조 타입 변수는 초기화하지 않으면 null 값을 가짐.
  3. 복잡한 데이터 표현 가능:
    • 객체 지향적인 설계에 적합.

3. 기본 타입과 참조 타입의 차이

항목기본 타입참조 타입

데이터 저장 방식 값 자체 저장 객체의 메모리 주소 저장
메모리 영역 스택(Stack) 힙(Heap)
초기값 각 타입의 기본값 null
사용 예 숫자, 문자, 논리 값 저장 문자열, 배열, 사용자 정의 객체

4. 형 변환

Java는 두 가지 형 변환을 제공:

1. 자동 형 변환 (Implicit Casting):

  • 작은 크기의 타입이 더 큰 크기의 타입으로 변환.
int num = 10; long bigNum = num; // int → long
 
 

2. 명시적 형 변환 (Explicit Casting):

  • 큰 크기의 타입을 작은 크기의 타입으로 변환. 데이터 손실 가능.
double value = 10.5; int intValue = (int) value; // double → int

5. 예제


결론

  • 기본 타입: 값 자체를 저장하고 메모리 사용이 효율적.
  • 참조 타입: 객체, 배열 등 복잡한 데이터를 관리하며 동적 메모리를 사용.

Java의 타입 시스템은 데이터의 안정적 관리와 성능을 보장하기 위해 설계되었음.

 

 


자바에서 강제 형변환시 주의할점

- 강제 형변환이 필요한 상황

  • 큰 데이터 타입 → 작은 데이터 타입:
    • 예: double → int, long → short
  • 상속 관계의 객체 변환:
    • 예: 부모 클래스 → 자식 클래스.

데이터가 작은 타입의 범위를 초과하면 오버플로(Overflow) 또는 언더플로(Underflow)가 발생함.


증감연산자

후위 연산자를 붙여 출력해도 연산은 수행된다.


조건문(if)과 Switch문

 

1. switch문이 더 좋은 경우

1) 조건이 단일 변수 또는 값 비교일 때

  • switch문은 하나의 정확한 값과 비교하는 경우에 최적화되어 있음.
  • 여러 값을 비교해야 할 때 가독성이 뛰어남.

 

2) 값이 열거형(Enum)이나 문자열인 경우

  • switch문은 enum 또는 String 값과 함께 사용할 때 적합함.

성능이 중요한 경우

  • switch문은 컴파일 시점에 조건 분기를 최적화하므로, 조건이 많을 때 if-else보다 더 빠르게 실행됨.
  • 특히 switch는 값 테이블을 생성하거나 jump table을 활용하여 분기를 처리함.

 

2. 언제 if문이 더 적합한가?

switch보다 if가 더 적합한 경우:

 

1. 복잡한 조건식:

  • switch는 단순한 값 비교에 적합하며, 복잡한 조건식은 지원하지 않음.
if (x > 10 && x < 20) { System.out.println("x는 10과 20 사이에 있습니다."); }
 

2. 범위 조건:

  • if는 값의 범위를 확인하거나 논리 연산을 수행하는 데 적합함.
if (age >= 13 && age <= 19) { System.out.println("청소년입니다."); }
 

3. 단일 조건 검사:

  • 간단한 참/거짓 조건일 경우 if문이 더 직관적임.
if (isActive) { System.out.println("활성 상태입니다."); }
 

3. 정리: switch와 if 사용 기준

상황추천 문법

단순한 값 비교 switch
조건이 복잡하거나 논리 연산이 필요 if
조건 분기가 많고, 값이 명확한 상수인 경우 switch
범위나 논리 조건 if
성능이 중요한 경우 switch
값이 enum 또는 String인 경우 switch

결론

  • switch는 단순한 값 비교에 최적화된 구조로, 가독성과 성능에서 유리.
  • if는 복잡한 조건이나 범위 검사에 적합.

 

반복문(Loop)의 흐름을 제어하기 위해 사용하는 키워드 : continue와 break

1. continue

역할

  • 현재 반복을 건너뛰고, 다음 반복을 실행.
  • 반복문의 조건 검사로 이동하여 루프를 계속 실행.

주요 특징

  1. 반복문(for, while, do-while) 내에서 사용 가능.
  2. 현재 반복만 스킵하며, 전체 반복문을 종료하지 않음.

 

- continue의 영향 범위

  • 가장 가까운 반복문현재 반복을 건너뛰고, 조건식 검사로 이동.
  • 반복문은 종료되지 않고, 다음 반복으로 넘어감.
  • 중첩 반복문에서 특정 반복문의 다음 반복으로 이동하려면 라벨(label) 사용.

2. break

역할

  • 반복문을 즉시 종료하고, 반복문 뒤의 코드로 실행 흐름을 이동함.

주요 특징

  1. 반복문(for, while, do-while)과 switch문에서 사용 가능.
  2. 반복문의 실행을 즉시 종료.
  3. 중첩 반복문에서 사용 시 가장 가까운 반복문만 종료.

 

- break의 영향 범위

  • 가장 가까운 반복문 또는 switch문을 즉시 종료.
  • break를 호출한 반복문 전체를 중단하고, 다음 코드로 실행 흐름을 이동.
  • 중첩 for문에서의 break는 내부 for문만 종료.
  • 중첩 반복문에서 특정 반복문을 종료하려면 라벨(label)을 사용.
  • ex) break outer 실행 시, 라벨이 선언된 반복문(외부 for문)이 종료됨.
  • 성능 측면에서는 라벨을 사용한 break와 플래그 변수를 사용하는 방식 사이에 큰 차이가 없음.

 

- 라벨 사용 예시

a: 와같이 라벨을 붙이고 break 라벨명을 사용한다. 라벨 대신 플래그변수를 사용해도 된다.


do-while문

do-while문은 반복문이 실행되기 전에 조건을 검사하지 않고, 반드시 한 번은 실행되는 특징이 있음.

 

사용자 입력을 받아 양수만 더하는 코드

설명 :

do 블록:

  • 사용자가 입력한 숫자를 처리하고, 조건을 확인하기 전에 한 번 실행.
  • 입력된 값이 양수이면 sum에 더함.

while 조건:

  • 입력된 값이 0 이상일 때만 반복.
  • 음수가 입력되면 반복 종료.

일단 do를 하게되고 이후 while문의 참 거짓에따라 반복문을 종료할지 정하게 된다.