Mingyu Kim

switch

1. 기본 구조와 변화

과거 switch 문은 break 문을 일일이 적어줘야 했고, 실수로 빠뜨리면 다음 case가 연달아 실행됐다. 자바 21에서는 이를 획기적으로 개선했다.

전통적인 방식

switch (grade) {
  case 'A':
  case 'a':
    System.out.println("우수 회원");
    break;
  case 'B':
  case 'b':
    System.out.println("일반 회원");
    break;
  default:
    System.out.println("손님");
}

현대적인 방식

-> 를 사용하여 break 없이도 깔끔하게 표현하며, switch의 결과값을 변수에 바로 대입할 수 있다.

String position = "과장";
int bonus = switch (position) {
  case "부장" -> 500;
  case "과장", "대리" -> 300; // 쉼표(,)로 여러 조건 나열 가능
  default -> 100;
};

2. Java 21의 핵심: 패턴 매칭

단순히 값을 비교하는 것을 넘어, 타입(Type)을 검사하고 변수를 즉시 선언할 수 있다.

public static String formatter(Object obj) {
  return switch (obj) {
    case Integer i -> String.format("정수: %d", i);
    case String s  -> String.format("문자열: %s", s);
    case Double d  -> String.format("실수: %f", d);
    default        -> "알 수 없는 타입";
  };
}

3. 가드(Guard): when

패턴 매칭과 함께 조건을 더 세밀하게 제어할 수 있는 when 키워드가 추가됐다. if 문을 중첩해서 쓰지 않아도 되어 가독성이 매우 좋아졌다.

Object obj = "Hello World";

switch (obj) {
  case String s when s.length() > 5 -> System.out.println("5글자 초과 문자열");
  case String s -> System.out.println("짧은 문자열");
  default -> System.out.println("기타");
}

4. yield 키워드

->를 사용하는 방식이 아니라 복잡한 로직(여러 줄의 코드) 처리 후 값을 반환해야 할 때는 yield를 사용한다.

int result = switch (mode) {
  case "ADD" -> {
    int a = 10;
    int b = 20;
    yield a + b; // 값을 반환하고 switch 블록 종료
  }
  default -> 0;
};

5. 요약 및 체크포인트