JAVA

switch 추가된 문법

devstep88 2023. 8. 6. 01:42

jdk 14에 추가된 문법

  • 기존의 case ... :를 대체하는 case ... -> 를 사용하여 불필요하게 장황한 코드를 개선할 수 있다.
// 기존
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;
}

// JDK 14
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);
}

case L1, L2 ... -> 에서 n개의 label을 동시에 작성할 수 있다.

화살표 뒤에 단일 명령문만 작성하는 경우 break; 를 제외해도 해당 블럭의 내용만 출력되나, 여러 명령문을 작성하는 경우 break; 가 필요하다.

switch (day) {
    case FRIDAY: System.out.println("is"); System.out.println("friday"); break;
    default: System.out.println("default");
}
/*
is
friday
*/

switch (day) {
    case FRIDAY: System.out.println("is"); System.out.println("friday");
    default: System.out.println("default");
}
/*
is
friday
default
*/

상수값 리턴

기존에 case 블럭 내에서 외부에서 선언된 변수에 값을 대입하는 로직대신, 직접 상수값을 리턴하도록 작성 할 수 있다.

Day day = Day.FRIDAY;
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9; 
};

System.out.println(numLetters); // 6

yield value; 는 Java 12에서 제공한 break value;와 동일한 기능이다. 단, 블럭 {} 내에서만 유효하다.

전체 블럭이 필요하면(case 내부에서 처리되어야하는 로직이 있는 경우) yield 문을 사용하여 리턴 값을 반환할 수 있다.

public static int doubleFunc(int k) {
    return k * 2;
}

public static void main(String[] args) {
    int j = switch (day) {
        case MONDAY  -> 0;
        case TUESDAY -> 1;
        // case SUNDAY -> yield 2; [error] yield 키워드는 블럭 내에서만 유효하다.
        default      -> {
            int k = day.toString().length();
            int result = doubleFunc(k);
            yield result;
        }
    };
    
    System.out.println(j); // 12
}

기존 형식에서도 yield 문을 사용해 다음과 같이 처리 가능하다.

int j = switch (day) {
    case MONDAY:
        yield 0; // case .. : 를 사용하는 경우 이와 같이 모든 case에 대해 yield가 필요하다.
    case TUESDAY:
        yield 1;
    default:
        int k = day.toString().length();
        int result = doubleFunc(k);
        yield result;
};

System.out.println(j);