[JDK 14] Switch 문에서 arrow operator 이용하기

2022. 5. 6. 15:44Java/Basic

300x250
반응형

JDK 14 에서는 Switch 문에서 -> 를 이용하여 표현식을 간소화하는 것을 지원합니다.

JEP 361: Switch Expressions


일반적인 switch 문에서는 아래와 같이 case문의 종료를 break로 정의해야했습니다.

@Test
void previous(){
    List<Animal> animals = Arrays.asList(Animal.CAT, Animal.CAT, Animal.LION, Animal.SNAKE, Animal.DUCK);

    animals.forEach(animal -> {
        int legs;
        switch (animal) {
            case CAT: case LION:
                legs = 4;
                break;
            case DUCK:
                System.out.println("오리는 꽥꽥");
                legs = 2;
                break;
            default:
                legs = 0;
                break;
        }
        System.out.printf("%s의 다리개수는 %d%n", animal.name(), legs);
    });
}

그런데 위의 코드에서 CAT과 LION에서 행할 실질적인 코드는 legs = 4 하나뿐입니다.

중간에 DUCK 의 경우를 제외하고 공통적으로 행하는 동작이 legs 변수에 값을 설정하는 작업입니다.

JDK 14에서 release된 switch 표현식에서는 switch문의 결과를 변수에 담을수 있으며, 한줄로 표시 할 수 있는 간단한 표현식을 -> 로 표현할 수 있습니다.

int legs = switch (animal) {
    case CAT, LION -> 4;
    case DUCK -> 2;
    default -> 0;
};

그런데 위의 코드에서는 case DUCK 구문에서 "오리는 꽥꽥"을 로그에 남기는 부분이 빠졌습니다.

만일, CASE 구문에서 작동되어야할 코드가 길다면 어떻게 해야할까.
바로 아래와 같이 {} 로 감싸서 코드를 작성하면 됩니다.

int legs = switch (animal) {
    case CAT, LION -> 4;
    case DUCK -> {
        System.out.println("오리는 꽥꽥");
        yield 2;
    }
    default -> 0;
};

단, {}로 case 구문을 표현할 때에는 반드시 yield 구문을 작성해야하는 것을 잊지 않아야 합니다. (없을 경우 에러가 발생됩니다.)

또, 위와같이 switch문의 결과를 특정 변수에 담도록 코드를 작성했을 때에는 모든 case문의 결과가 반드시 yield 되어야합니다.

Switch Expressions를 적용한 최종 예제 코드입니다.


++ References

300x250
반응형

TAG