문제의 역사:
자바 12 이전에는 switch 문이 오직 statement로만 사용되었습니다. 자바 12/14의 출시로 switch 표현식(switch expression)이 생겨났으며, 이는 구문과 operator의 기능을 확장했습니다. switch 표현식은 더 간결하고 표현력이 풍부한 코드를 위한 것입니다.
문제점:
전통적인 switch는 종종 오류를 발생시킵니다: break를 잊으면 fall-through가 발생하고, 여러 case가 있을 때 가독성이 떨어지며, 결과를 직접적으로 표현식에서 반환할 수 없고, 값의 전체적인 검사를 하지 못합니다.
해결책:
switch 표현식은 값을 반환할 수 있고, 화살표 구문을 사용하며, 컴파일 단계에서의 전체적인 분석을 지원하고 null을 default를 통해 처리할 수 있습니다. 구문은 다음과 같습니다:
String result = switch(day) { case MONDAY, FRIDAY -> "Workday"; case SATURDAY, SUNDAY -> "Weekend"; default -> throw new IllegalArgumentException(); };
주요 특징:
switch가 enum, 문자열 및 null과 함께 작동할 수 있습니까?
enum과 함께 Java 5부터 작동합니다. 문자열과는 Java 7부터 가능합니다. null은 default를 통해서만 처리할 수 있으며, 그렇지 않으면 NPE가 발생합니다.
switch(day) { // day == null default: System.out.println("null"); } // 작동합니다
switch 표현식에서 enum의 모든 경우를 구현하지 않으면 어떻게 됩니까?
컴파일러는 모든 값에 대해 default 또는 implementation을 요구합니다. 이를 누락하면 컴파일 오류가 발생합니다.
새로운 유형의 switch 표현식에서 break를 사용할 수 있습니까?
화살표 방식에서는 break가 필요 없습니다. 블록을 사용할 경우 (case X -> { ... }) yield를 사용하여 값을 반환할 수 있습니다:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
break가 없는 int와 함께 전통적인 switch:
switch(type) { case 1: actionA(); case 2: actionB(); // type==1과 type==2 모두에서 호출됩니다 }
장점:
단점:
enum과 결과를 비교하기 위해 새로운 switch 표현식을 사용하는 예:
String status = switch(orderStatus) { case PAID -> "지불됨"; case CANCELED -> "취소됨"; default -> "처리 중"; };
장점:
단점: