Switch Expression in Java 14

nunddu·2020년 10월 5일
6

Java의 새로운 Switch 표현 방법은 Java 12에서 처음 소개 되었고, Java 13, 14 버전을 거치면서 사소한 변경만 몇 차례 있었다. 기존의 Switch 표현과 새로운 표현을 비교하며 관련 내용을 정리하려고 한다. 먼저 변경 전과 후의 특징을 비교하고 간단한 코드를 통해 차이점을 알아보려고 한다.

변경 전과 후 특징 비교

Tranditional Switch Expression

  • C, C++에서 사용하는 형태의 Switch 형식을 따른다.
  • 불필요한 반복코드 존재한다.
  • 다수의 casebreak가 존재한다.
  • 개발자의 실수로 break를 빼먹을 경우 다음 분기로 넘어가게 됨.

New Switch Expression

  • Switch 내에서 라벨이 일치하는 경우, case -> A와 같은 형식으로 표현이 가능하다.
  • 단일 수행 또는 블록 수행이 가능하다.
  • Switch 블록 내에서 계산된 값을 반환하는 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 표현에서 사용되는 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; }를 꼭 작성해야 한다. 위 두 가지 경우가 아니면 에러가 발생한다.

yield 키워드는 변수명으로 사용이 가능하다

Java에서 예약어는 변수명으로 사용할 수 없다. 하지만 yield는 신기하게도 변수명으로 사용할 수 있다.

int volatile = 3; // error!
int yield = 3; // ok

간단하게 Switch Expression에 대해 정리해봤다. 기존 Switch 문법에 대해 모르고 쓸 때는 불편함을 못 느꼈는데, 새로운 표현과 비교해보니 기존 Switch가 얼마나 비효율적인 구조였는지 느낄 수 있었다. 들리는 말에 따르면 코틀린 문법과도 유사한 부분이 있다고하니, 자주 쓰면서 익숙해져야겠다.

1개의 댓글

comment-user-thumbnail
2022년 9월 25일

혹시,, 많이 도움이 되어 제 포스팅에 링크를 첨부하고 싶은데 양해 부탁드려도 될까요??

답글 달기