티스토리 뷰

프로그래밍/Java

[Java 14] Enhanced Switch Expressions

개발자 카니 2020. 8. 4. 06:24

Java 12, 13에서 2번의 Preview를 통해 강화된 Switch 표현식이 Java 14에서 표준화되었다.

기존 switch 구문

public class SwitchExpressionsExample {
    public static void main(String[] args) {
        SwitchExpressionsExample example = new SwitchExpressionsExample();
        example.printDay(Day.FRI);
        example.printDay(Day.TUE);
        example.printDay(Day.SUN);
    }

    public void printDay(Day today) {
        switch (today) {
            case MON:
            case TUE:
            case WED:
            case THUR:
            case FRI:
                System.out.println(today.name() + " is Weekday");
                break;
            case SAT:
            case SUN:
                System.out.println(today.name() + " is Weekend");
                break;
        }
    }

    enum Day {
        MON, TUE, WED, THUR, FRI, SAT, SUN
    }
}
  • 'break'의 위치에 따라 실행 결과가 달라질 수 있기 때문에 개발자가 의도적으로 'break'를 했는지 실수인지 파악하기 어렵다.

강화된 switch 표현식

public void printDay(Day today) {
    switch (today) {
        case MON, TUE, WED, THUR, FRI -> System.out.println(today.name() + " is Weekday");
        case SAT, SUN -> System.out.println(today.name() + " is Weekend");
    }
}
  • 여러 조건에 따라 ','로 구분해서 한 번에 처리할 수 있다.
  • 단일 실행으로 '->'만 추가했지만, '{}' 형태로 구문을 만들 수 있다.
  • '->' 대신 ':'을 사용해서 예전 방식으로 사용할 수도 있다.

반환값 받기

public String printDay(Day today) {
    String result = switch (today) {
        case MON, TUE, WED, THUR, FRI -> today.name() + " is Weekday";
        case SAT, SUN -> today.name() + " is Weekend";
    };
    return result;
}
  • 표현식으로 변경되었기 때문에 결과값을 반환 받는 형식으로 만들 수 있다.
  • 반환값의 타입을 Object로 설정하게 되면 표현식마다 다른 자료형을 반환할 수도 있다.
  • 반환값이 있을 때 표현식이 void를 반환하면 컴파일 에러가 발생한다.

반환값이 있는 표현식을 블록('{}') 구문으로 사용

public String printDay(Day today) {
    String result = switch (today) {
        case MON, TUE, WED, THUR, FRI -> today.name() + " is Weekday";
        case SAT, SUN -> {
            System.out.print("Holiday! ");
            yield today.name() + " is Weekend";
        }
    };
    return result;
}
  • 'yield' 키워드를 사용해서 반환(java 13에서 변경된 내용으로 java 12를 사용한다면 'yield'대신 'break'를 사용하면 된다.)
  • 'return' 키워드를 사용하면 컴파일 에러가 발생한다. (반환값이 없는 경우라면 return을 사용할 수도 있다.)

References

댓글