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가 얼마나 비효율적인 구조였는지 느낄 수 있었다. 들리는 말에 따르면 코틀린 문법과도 유사한 부분이 있다고하니, 자주 쓰면서 익숙해져야겠다.
혹시,, 많이 도움이 되어 제 포스팅에 링크를 첨부하고 싶은데 양해 부탁드려도 될까요??