-
[JAVA] Switch ExpressionStudy/Theory 2025. 5. 26.
Java Switch Expression 완벽 가이드
왜 만들어졌을까?
기존 switch문은 여러 가지 문제점을 가지고 있었다.
기존 Switch문의 문제점
// 기존 방식의 문제점들 String dayType; switch (day) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: case FRIDAY: dayType = "평일"; break; // break를 빼먹으면 fall-through 발생! case SATURDAY: case SUNDAY: dayType = "주말"; break; default: dayType = "알 수 없음"; break; }주요 문제점:
- Fall-through 버그: break문을 빼먹으면 의도치 않게 다음 케이스로 넘어감
- 보일러플레이트 코드: 매번 변수에 값을 할당하고 break를 써야 함
- 가독성 문제: 코드가 길어지고 본질적인 로직이 묻힘
- 타입 안전성 부족: 컴파일러가 모든 케이스 처리 여부를 완벽하게 검증하지 못함
언제 도입되었을까?
Switch Expression의 발전 과정:
- Java 12 (2019년 3월): Preview 기능으로 처음 등장
- Java 13 (2019년 9월): Preview 기능 개선, yield 키워드 도입
- Java 14 (2020년 3월): 정식 기능으로 승격
무엇이 바뀌었을까?
1. 화살표 구문 (->) 도입
// 기존 방식 String result; switch (value) { case A: result = "에이"; break; case B: result = "비"; break; } // 새로운 방식 String result = switch (value) { case A -> "에이"; case B -> "비"; };2. 표현식(Expression)으로 변화
기존 switch문은 Statement이었지만, 이제 표현식(Expression)이 되어 값을 직접 반환할 수 있다.
// 표현식이므로 직접 값을 반환 int score = switch (grade) { case A -> 90; case B -> 80; case C -> 70; default -> 0; }; // 메서드 호출에서도 바로 사용 가능 processResult(switch (status) { case SUCCESS -> "성공 처리"; case FAILED -> "실패 처리"; default -> "알 수 없음"; });3. Fall-through 방지
화살표 구문을 사용하면 자동으로 break가 적용되어 fall-through가 불가능하다.
// 안전함 - fall-through 불가능 String result = switch (day) { case MONDAY -> "월요일"; case TUESDAY -> "화요일"; // 자동으로 break 적용 default -> "기타"; };4. 복잡한 로직 처리 - yield 키워드
복잡한 로직이 필요한 경우 중괄호와 yield 키워드를 사용. yield는 Switch Expression에서 값을 반환하는 키워드다.
중괄호 블록 안에서 여러 줄의 코드를 작성한 후 최종 결과를 반환할 때 사용합니다.
String result = switch (actionType) { case SIMPLE -> "단순 처리"; case COMPLEX -> { // 복잡한 로직 처리 System.out.println("복잡한 처리 시작"); String processed = processComplexLogic(); System.out.println("처리 완료"); yield processed; // yield로 값 반환 (return이 아님!) } default -> "기본 처리"; };yield vs return 차이점:
- return: 메서드에서 값을 반환하고 메서드 종료
- yield: Switch Expression에서만 사용, 해당 case의 값을 반환
5. 다중 케이스 처리 개선
// 여러 케이스를 쉼표로 구분 String dayType = switch (day) { case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "평일"; case SATURDAY, SUNDAY -> "주말"; };6. 모든 케이스 처리 강제
컴파일러가 모든 가능한 케이스가 처리되었는지 더 엄격하게 검사합니다.
// enum의 모든 값을 처리하지 않으면 컴파일 에러 public String getSeasonType(Season season) { return switch (season) { case SPRING -> "봄"; case SUMMER -> "여름"; case FALL -> "가을"; // WINTER를 빼먹으면 컴파일 에러! }; }기존 방식과의 비교
구분 기존 Switch문 Switch Expression
문법 case: + break case -> Fall-through 실수 위험 있음 불가능 (안전) 코드 길이 길고 반복적 간결함 값 반환 별도 변수 필요 직접 반환 다중 케이스 케이스별 반복 쉼표로 간단히 컴파일러 검증 부분적 더 엄격함 가독성 보통 우수함 Switch Expression의 핵심 변화:
- 화살표 구문 (->)으로 간결한 문법 제공
- 표현식이 되어 값을 직접 반환 가능
- Fall-through 방지로 더 안전한 코드 작성
- yield 키워드로 복잡한 로직 처리 지원
- 컴파일러 검증 강화로 모든 케이스 처리 보장
'Study > Theory' 카테고리의 다른 글
ResponseEntity 를 왜 쓰는 걸까? (0) 2026.02.23 [JAVA] Record :: 불변 데이터를 위한 간결한 문법 (0) 2025.05.24 [DB] 트랜잭션, ACID (0) 2024.09.20 [DB] 인덱스 장단점 (1) 2024.09.16 [운영체제] 캐시의 지역성 (1) 2024.09.10