개발/자바

Java 14 switch 표현식 (switch expression)

피터JK 2025. 2. 18. 13:44
728x90

Java 14에서 도입된 switch 문은 **switch 표현식(switch expression)**으로, 기존의 switch 문을 더 간결하고 유용하게 개선한 기능입니다. 주요 특징은 switch 문을 문(statement) 뿐만 아니라 **표현식(expression)**으로도 사용할 수 있게 되어 더 강력해졌다는 점입니다.

JDK 14에서의 switch 문 주요 특징:

  1. 화살표 문법 (->): 기존 switch 문에서는 case와 :를 사용했습니다. Java 14에서는 ->를 사용하여 더 간결하고 명확한 문법을 제공합니다. 이로 인해 break 문이 필요 없어졌습니다.
  2. 값 반환 가능: switch가 이제 표현식으로 사용될 수 있기 때문에, 값을 직접 반환할 수 있습니다. case마다 값을 반환하는 방식으로 더 유연하게 사용할 수 있습니다.
  3. 다중 레이블을 하나의 case에 지정 가능: 여러 개의 case를 하나로 묶을 수 있어 코드가 더 간결해집니다.
  4. break 불필요: -> 문법을 사용할 경우, break 문이 필요하지 않습니다. case가 끝날 때 자동으로 흐름이 종료됩니다.
  5. yield 키워드: switch를 표현식으로 사용할 때는 yield 키워드를 사용하여 값을 반환합니다. 이전 버전에서는 return을 사용했지만, switch 표현식에서는 yield로 값을 반환합니다.

JDK 14에서의 switch 예시:

public class SwitchExample {
    public static void main(String[] args) {
        String day = "MONDAY";

        // switch를 표현식으로 사용
        int dayNumber = switch (day) {
            case "MONDAY" -> 1;
            case "TUESDAY" -> 2;
            case "WEDNESDAY" -> 3;
            case "THURSDAY" -> 4;
            case "FRIDAY" -> 5;
            case "SATURDAY" -> 6;
            case "SUNDAY" -> 7;
            default -> throw new IllegalArgumentException("Invalid day: " + day);
        };

        System.out.println("Day number is: " + dayNumber);
    }
}

설명:

  • switch 표현식: switch 문을 표현식으로 사용하여, dayNumber에 값을 직접 할당합니다.
  • -> 문법: case는 이제 -> 문법으로 간결하게 표현됩니다.
  • yield: 여러 개의 문을 처리하는 복잡한 case에서는 yield를 사용하여 값을 반환할 수 있습니다. (예시에서는 단순한 값 반환이기 때문에 yield는 사용되지 않았습니다.)

이 기능의 장점:

  • switch 문을 더 유연하게 사용할 수 있습니다.
  • break 문을 생략할 수 있어 실수를 줄일 수 있습니다.
  • 함수형 프로그래밍 스타일로 switch를 활용할 수 있게 되어 더 직관적이고 간결한 코드 작성이 가능합니다.

이 기능은 Java 12에서 미리보기로 도입되었고, Java 14에서 정식으로 포함되었습니다.

 

 

yield 키워드 설명

yield 키워드는 Java 14에서 switch 표현식을 사용할 때, case 블록 내에서 값을 반환하는 데 사용됩니다. switch 문을 표현식으로 사용할 때는 각 case에서 yield를 사용하여 반환값을 명시적으로 지정해야 합니다.

기존의 switch 문에서는 각 case에 대해 값을 반환하려면 break 문을 사용하거나 여러 문을 실행하는 방식으로 처리해야 했지만, switch 표현식에서는 yield를 사용하여 보다 간결하고 명확하게 값을 반환할 수 있습니다.

yield 사용법

yield는 switch 표현식 내에서 값을 반환하려면 반드시 사용해야 합니다.
switch 표현식은 값을 반환해야 하기 때문에, 각 case 내에서 yield 키워드를 통해 반환할 값을 지정합니다.

예시:

public class YieldExample {
    public static void main(String[] args) {
        String day = "MONDAY";

        // switch 표현식에서 yield 사용
        int dayNumber = switch (day) {
            case "MONDAY" -> {
                yield 1;
            }
            case "TUESDAY" -> {
                yield 2;
            }
            case "WEDNESDAY" -> {
                yield 3;
            }
            case "THURSDAY" -> {
                yield 4;
            }
            case "FRIDAY" -> {
                yield 5;
            }
            case "SATURDAY" -> {
                yield 6;
            }
            case "SUNDAY" -> {
                yield 7;
            }
            default -> throw new IllegalArgumentException("Invalid day: " + day);
        };

        System.out.println("Day number is: " + dayNumber);
    }
}

설명:

  • yield 사용: 각 case 내에서 yield를 사용하여 값을 반환합니다. case는 ->로 시작하지만, 여러 문을 실행할 때는 {} 안에 yield를 사용하여 반환값을 지정해야 합니다.
  • switch 표현식: switch 문이 표현식으로 사용되므로, dayNumber에 값을 직접 할당할 수 있습니다.
  • default: default 구문에서 예외를 던져 day가 유효하지 않으면 오류를 발생시킵니다.

yield의 필요성

  • switch 표현식에서 여러 문을 실행하려면 {} 블록을 사용해야 하며, 이 경우 yield를 통해 반환값을 지정해야 합니다.
  • 단일 값 반환이 아닌 여러 문을 실행하는 경우에도 yield를 사용하여 반환값을 지정하는 것이 필수적입니다.

yield가 필요한 경우:

  1. 여러 문을 실행하는 case: 복잡한 논리가 필요한 경우.
  2. 값을 반환하는 case: switch를 표현식으로 사용하면서 값을 반환하려는 경우.

예를 들어, 조건에 따라 복잡한 연산을 하고 그 결과를 반환하는 경우 yield를 사용하여 값을 반환할 수 있습니다.

public class YieldComplexExample {
    public static void main(String[] args) {
        String day = "MONDAY";
        
        int dayNumber = switch (day) {
            case "MONDAY" -> {
                int temp = 1;  // 예시로 추가된 복잡한 연산
                yield temp;
            }
            case "TUESDAY" -> 2;
            case "WEDNESDAY" -> 3;
            default -> throw new IllegalArgumentException("Invalid day: " + day);
        };

        System.out.println("Day number is: " + dayNumber);
    }
}

위 예시에서처럼 switch 표현식 내에서 여러 문을 실행할 때 yield가 필요합니다.

 

Switch를 표현식이 아닌 문으로 사용할 때

반환 값이 없는 경우는 기존 처럼 switch 문(switch statement)으로 처리하면 됩니다.

public class SwitchStatementExample {
    public static void main(String[] args) {
        String day = "MONDAY";

        // switch 문에서 로직만 처리하고 반환값은 없음
        switch (day) {
            case "MONDAY":
                System.out.println("It's Monday!");
                break;
            case "TUESDAY":
                System.out.println("It's Tuesday!");
                break;
            case "WEDNESDAY":
                System.out.println("It's Wednesday!");
                break;
            case "THURSDAY":
                System.out.println("It's Thursday!");
                break;
            case "FRIDAY":
                System.out.println("It's Friday!");
                break;
            case "SATURDAY":
                System.out.println("It's Saturday!");
                break;
            case "SUNDAY":
                System.out.println("It's Sunday!");
                break;
            default:
                System.out.println("Invalid day!");
        }
    }
}

 

728x90