switch 추가된 문법

    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);

    댓글