새로운 switch 문인 Switch Expressions은 더 간결하고 읽기 쉬워졌습니다.
Switch Expressions는 확장일 뿐 대체가 아닙니다.
break문에 대한 필요성을 제거했고, 코드 실행은 첫 번째 일치 이후에 일어나지 않습니다.
또 다른 주목할만한 차이점은 switch 문을 변수에 직접 할당할 수 있다는 점입니다.
값은 반환하지 않고 스위치 표현식에서 코드를 실행할 수 있습니다.
기존의 switch 문을 살펴 보겠습니다.
@Log4j2
public class SwitchExpressionEx {
// JDK14에서 공식으로 나온 Switch Expression
public static void main(String[] args) {
int number = 3;
log.trace("main({}) invoked.", Arrays.toString(args));
// 기존 swtich 문
String day = "TUESDAY";
boolean isTodayHoliday;
switch(day){
case "MONDAY":
case "TUESDAY":
case "WEDNESDAY":
case "THUSDAY":
case "FRIDAY": isTodayHoliday = false; break;
case "SATURDAY":
case "SUNDAY": isTodayHoliday = true; break;
default: throw new IllegalArgumentException(day); // 예외처리
}
log.info("\t + day : {}, isTodayHoliday: {}", day, isTodayHoliday);
// =============================================================
// Invalid expression zs statment => 값 반환 시, Lvalue 생략이 불가능
// Duplicate case(중복된 케이스)는 허용되지 않음
isTodayHoliday = switch(day) {
// 아래의 값중 하나라도 해당이 된다면 false 또는 true를 반환
case "MONDAY", "TUESDAY", "WEDNESDAY", "THUSDAY", "FRIDAY" -> false;
case "SATURDAY", "SUNDAY" -> true;
default -> throw new IllegalArgumentException();
}; // switch expression
위 처럼 기존의 switch 문은 값을 반환할 수 없었습니다.
주석 구별선 아래는 JAVA 14부터 새롭게 배포된 switch expression 코드입니다.
switch expression은 boolean에 값의 반환이 가능하고,
switch 중괄호에 마지막에 세미콜론(;)으로 마무리합니다.
여기서 중요한 점은
새로운 switch expression 에서는 default 생략이 불가능합니다.
또한 값을 반환받는 Lvalue(isTodayHoliday) 생략이 불가능합니다.
또한, 기존의 switch 문과 혼용이 가능합니다.
int value = 1000;
switch(value) {
case 100 -> {
log.info("case100");
log.info("Hello, World");
} // 100
case 200 -> {
log.info(value);
} // 200
case 300 -> {;;} // 결정된 코드가 없으면 중괄호 안 세미콜론으로 구분
default -> {
log.info("default");
throw new IllegalArgumentException("Unknown Value : " + value);
} // default
} // switch expression
기존의 switch 문처럼 실행문장을 실행시키는 용도로만 사용한다면, default 생략이 가능합니다.
기존의 switch문처럼 열거상수도 사용이 가능합니다.
// 열거 타입(enum type)
enum Week{
// 열거상수
MON,
TUE,
WED,
THU,
FRI,
SAT,
SUN
}
// =============================================================
Week today = Week.FRI; // 열거 타입 변수에, 열거 상수 Week.FRI로 초기화
switch(today) {
case FRI -> log.info(today);
}
switch 문이든 switch Expression이든, case에 열거상수 지정 방법은 같습니다.