변경 전과 후 특징 비교
변경 전)
- C, C++에서 사용하는 형태의 Switch 형식을 따른다.
- 불필요한 반복코드 존재한다.
- 다수의 case와 break가 존재한다.
- 개발자의 실수로 break를 빼먹을 경우 다음 분기로 넘어가게 됨.
변경 후)
- Switch 내에서 라벨이 일치하는 경우, case -> A와 같은 형식으로 표현이 가능하다.
- 단일 수행 또는 블록 수행이 가능하다.
- Switch 블록 내에서 계산된 값을 반환하는 yeild라는 키워드가 생겼다.
- 여러 조건을 쉼표로 구분하여 한 라인으로 처리할 수 있음.
테스트 클래스 정의
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;
};
}
반환 yield
-> 표현 오른쪽에 오는 처리는 꼭 단일 수행이 아니어도 된다. 이때는 {} 블록을 만들고 그 안에 수행할 코드를 작성하면된다. 또 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;
}
}
default
Switch의 반환값이 따로 필요하지 않은 경우나, case가 Switch로 들어오는 모든 인자를 커버하는 경우에는 default 항목을 따로 넣어주지 않아도 된다. 하지만 그렇지 않은 경우에는 default -> { your code; }를 꼭 작성해야 한다. 위 두 가지 경우가 아니면 에러가 발생한다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Collection Framework (자료구조 종류) (0) | 2025.02.09 |
---|---|
[Java] Comparable과 Comparator : 비교를 위한 인터페이스 (0) | 2024.10.22 |
[Java] Collections 클래스 (0) | 2024.10.22 |
[Java] Generic 제네릭 (0) | 2024.10.22 |
[Java] BigDecimal (0) | 2024.09.04 |