자바 스위치 사례: 개선된 버전

Java 12에서는 switch-case 문을 작성하는 방법을 개선한 switch 식을 도입했습니다.

다음 몇 버전에서 switch-case 문이 여러 번 개선되었습니다. 개선 사항을 살펴보고 원래의 switch-case 문과 비교해 봅시다.

1. 화살표 케이스 표현



이전에는 case 블록이 break 문으로 끝나야 했습니다. 그렇지 않으면 통과 문제가 발생합니다.

// OLD
switch (x) {
    case 1:
        System.out.println("One");
        break;
    case 2:
        System.out.println("Two");
        break;
    default:
        System.out.println("Unknown");
}


이제 화살표 케이스 표현식을 사용하여 케이스 블록을 단순화할 수 있습니다. 대소문자가 일치하면 화살표 뒤에 나오는 문장만 실행됩니다.

// NEW
switch (x) {
    case 1 -> System.out.println("One");
    case 2 -> System.out.println("Two");
    default -> throw new IllegalArgumentException();
}


이는 람다 구문과 유사합니다. 여러 문이 있는 경우 대신 블록을 사용할 수 있습니다.

// NEW (with block)
switch (x) {
    case 1 -> {
        System.out.println("One");
        System.out.println("One again");
    }
    case 2 -> System.out.println("Two");
    default -> System.out.println("Unknown");
}


2. 다중 일치 값



폴스루가 필요한 경우 어떻게 해야 합니까? 이전 방식에서는 각 값에 대해 별도의 사례를 작성하고 작업을 포함할 마지막 사례로 넘어가도록 해야 했습니다.

// OLD (fallthrough)
switch (x) {
    case 1:
    case 2:
        System.out.println("Valid values");
        break;
    default:
        System.out.println("Unknown");
}


개선된 버전에서는 쉼표로 구분된 값 목록을 사용하여 이 작업을 수행할 수 있습니다.

// NEW (multiple values)
switch (x) {
    case 1, 2:
        System.out.println("Valid values");
    default:
        System.out.println("Unknown");
}


3. 스위치 표현



큰 개선점은 switch 문을 사용하여 값을 반환할 수 있으므로 표현식으로 사용할 수 있다는 것입니다.

예를 들어 switch-case 블록 인라인을 사용하여 값을 단어로 인쇄할 수 있습니다.

// switch expressions
System.out.println(switch (x) {
    case 1 -> "One";
    case 2 -> "Two";
    default -> "Unknown";
});


4. yield 키워드



case가 하나의 문을 가질 때 위에서 본 것처럼 문에서 반환되는 값은 switch 표현식에서 반환됩니다.
케이스에 블록이 있는 경우 yield 키워드를 사용하여 명시적으로 값을 반환해야 합니다.

// switch expressions with yield
String word = switch (x) {
    case 1 -> {
        doSomething();
        yield "One";
    }
    case 2 -> "Two";
    default -> "Unknown";
};


이전 스타일의 케이스 블록은 switch 식에도 사용할 수 있으며 yield 문을 포함할 수 있습니다.
yield 문을 사용할 때 break 문은 필요하지 않습니다.

그러나 이것은 권장되지 않습니다. 혼란과 예기치 않은 실수를 피하기 위해 새로운 스타일을 고수하는 것이 가장 좋습니다.

// old-style case blocks with yield
String word = switch (x) {
    case 1:         
        doSomething();
        yield "One";
    case 2: 
        yield "Two";
    default:
        yield "Unknown";
};


5. 스위치 표현식의 완전성



Switch case 문은 철저할 필요가 없습니다. 대소문자가 일치하지 않고 기본 대소문자가 없어도 괜찮습니다.
그러나 값을 반환하기 위해 스위치를 사용할 때는 모든 경우가 포함되어야 하며 그 중 하나는 항상 일치해야 합니다.

예를 들어 숫자 전환을 구현할 때 기본 사례를 생략할 수 없습니다.

// missing default case
String word = switch (x) {
    case 1 -> "One";
    case 2 -> "Two";
};

/* gives the error:
error: the switch expression does not cover all possible input values
      String word = switch (x) {
                    ^
*/


즉, 부울로 작업하지 않는 한 항상 기본 케이스가 필요합니다.

이에 대한 유일한 예외는 열거형을 사용하고 가능한 모든 열거형 값을 포함하는 경우입니다.

아래 코드는 잘 작동하지만 사례 중 하나를 제거하면 위와 동일한 오류가 발생합니다.

// switch expressions with enum
public class MyClass {
    static enum Color { RED, GREEN, BLUE };

    public static void main(String[] args) {
        Color color = Color.RED;
        System.out.println(switch (color) {
            case RED -> "Red";
            case GREEN -> "Green";
            case BLUE -> "Blue";
        });
    }
}


그것이 개선을 위한 것입니다. 언급할 가치가 있는 또 하나의 기능은 패턴 일치이지만 아직 미리 보기 기능이기 때문에 다루지 않았습니다.

주목해야 할 중요한 점은 구문이 개선되었다고 해서 이전 구문이 현재 유효하지 않다는 의미는 아닙니다. 두 구문 모두 작동합니다.


읽어 주셔서 감사합니다. 나와 소통하고 싶다면 정기적인 Java 팁과 퀴즈를 게시하는 곳에서 나를 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기