Java의 새로운 Switch 표현 방법은 Java 12에서 처음 소개 되었고, Java 13, 14 버전을 거치면서 사소한 변경만 몇 차례 있었다. 기존의 Switch 표현과 새로운 표현을 비교하며 관련 내용을 정리하려고 한다. 먼저 변경 전과 후의 특징을 비교하고 간단한 코드를 통해 차이점을 알아보려고 한다.
case와 break가 존재한다.break를 빼먹을 경우 다음 분기로 넘어가게 됨.case -> A와 같은 형식으로 표현이 가능하다.yeild라는 키워드가 생겼다.비교를 위해 간단한 요일 enum 객체를 정의했다.
enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }
간단한 코드 비교를 통해 새로워진 Switch의 가장 큰 변화부터 살펴보려고 한다. 먼저, 기존의 Switch 표현을 통해 요일에 따른 처리를 한다면 다음과 같은 코드를 작성할 수 있을 것이다.
static void test(Day day){
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
}
MONDAY, FRIDAY SUNDAY는 동일한 처리를 하기 위해 연속적으로 위치해야하고 미관상으로도 좋지 않다. 또 전체적으로 case, break, System.out.prinln()이 반복된다는 것을 알 수 있다. 새로워진 Switch에서는 위와 같은 불편함이 해소되었다.
static void test(Day day){
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
}
조건에 해당하는 라벨을 ,로 구분하여 한 줄에 쓸 수 있고, -> 화살표를 통해 처리할 코드를 작성할 수 있다. 새로운 Switch 표현을 사용해 이전 보다는 간결해 졌지만 여전히 System.out.println()이 반복되는 것을 알 수 있다. 이런 경우에는 다음과 같은 표현도 가능하다.
public void test(Day day) {
System.out.println(
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
});
}
System.out.println() 인자에 Switch를 사용할 수 있다. 기존 Switch는 반환값이 없었는데, 새로운 Switch는 반환값을 갖는다. 따라서 다음과 같은 표현이 가능하다.
public void test(Day day) {
int cnt = switch(day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
}
-> 표현 오른쪽에 오는 처리는 꼭 단일 수행이 아니어도 된다. 이때는 {} 블록을 만들고 그 안에 수행할 코드를 작성하면된다. 또 Switch 표현에서 사용되는 yield라는 키워드가 생겼다. 새로운 Switch 표현이 처음 나온 Java 12에서는 break value;와 같은 문법으로 해당 기능을 지원했으나 현재 Java 14에서는 yield로 변경되었다. yield는 쉽게 말게 함수의 return과 비슷하다고 할 수 있다. yield는 해당 Switch 블록에 특정 값을 Switch의 결과값으로 반환하는 것이다. 예시는 다음과 같다.
public void test(Day day) {
int cnt = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
case WEDNESDAY -> {
int k = day.toString().length();
int result = k+5;
yield result;
//break result; <----- java 12 Switch Expression
}
default -> 0;
};
}
yield 키워드는 항상 Switch 블록 내부에서만 사용된다.
public void test(Day day) {
int cnt = switch (day) {
case MONDAY -> 0;
case TUESDAY -> yield 1; // error! yield는 block 안에서만 유효다
case WEDNESDAY -> { yield 2;} // ok
default -> 0;
}
}
Switch의 반환값이 따로 필요하지 않은 경우나, case가 Switch로 들어오는 모든 인자를 커버하는 경우에는 default 항목을 따로 넣어주지 않아도 된다. 하지만 그렇지 않은 경우에는 default -> { your code; }를 꼭 작성해야 한다. 위 두 가지 경우가 아니면 에러가 발생한다.
Java에서 예약어는 변수명으로 사용할 수 없다. 하지만 yield는 신기하게도 변수명으로 사용할 수 있다.
int volatile = 3; // error!
int yield = 3; // ok
간단하게 Switch Expression에 대해 정리해봤다. 기존 Switch 문법에 대해 모르고 쓸 때는 불편함을 못 느꼈는데, 새로운 표현과 비교해보니 기존 Switch가 얼마나 비효율적인 구조였는지 느낄 수 있었다. 들리는 말에 따르면 코틀린 문법과도 유사한 부분이 있다고하니, 자주 쓰면서 익숙해져야겠다.
혹시,, 많이 도움이 되어 제 포스팅에 링크를 첨부하고 싶은데 양해 부탁드려도 될까요??