반복은 학습의 어머니입니다. 앞서 Java의 switch 키워드 에 대해 이미 이야기했지만 오늘은 기본 사항을 검토하고 몇 가지 새로운 정보를 파헤쳐 보겠습니다.

Java에는 switch 문과 switch 표현식 의 두 가지 유형의 스위치 구조가 있습니다. switch 표현식은 Java 14에서 공식화되었으며 버전 12 및 13의 두 가지 비공식 "미리보기" 변형에 존재했습니다.

그러나 처음부터 시작합시다. 버전 12 이전의 좋은 스위치가 어땠는지 기억해 봅시다.


public String getProductTypeByName(String product) {
    String productType = "";

    switch (product) {
        case "Apple":
            productType = "Fruit";
            break;

        case "Peach":
            productType = "Fruit";
            break;

        case "Raspberry":
            productType = "Berry";
            break;

        case "Cherry":
            productType = "Berry";
            break;

        case "Tomato":
            productType = "Vegetable";
            break;

        default:
            productType = "other";
            break;
    }
        
    return productType;
}

switch 문은 차례대로 실행될 구문 집합입니다. 값을 반환할 수 없습니다. switch 문을 사용할 때의 주요 문제는 무한한 수의 case 표현식을 추가할 수 있다는 것이며 이 기능은 종종 프로그래머에 의해 남용됩니다.

Java 12에는 실험적 기능이 추가되었습니다. 새로운 버전의 switch는 switch 문이 아니라 switch 표현식입니다. 이 버전은 값을 생성하고 함수형 프로그래밍을 내부적으로 사용하며 공통 값이 있는 case 문을 병합할 수 있습니다. 컴팩트하게 구성하십시오.

Java 12에서는 다음과 같이 getProductTypeByName() 메서드를 다시 작성할 수 있습니다 .


public String getProductTypeByName(String product) {
    return switch (product) {
        case "Apple", "Peach" -> "Fruit";
        case "Raspberry", "Cherry" -> "Berry";
        case "Tomato" -> "Vegetable";
        default -> "other";

    };
}

이제 코드가 더 깔끔해 보입니다. 함수형 프로그래밍의 화살표 구문을 사용하면 break 키워드 없이 값을 반환할 수 있으며 일반적으로 스위치 실행 결과를 변수에 저장하거나 return 키워드를 통해 반환할 수 있습니다.

결과를 반환해야 할 뿐만 아니라 여러 줄의 코드가 필요한 경우 스위치는 다음 과 같습니다.


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            break "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            break "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            break "Vegetable";
        }
        default -> {
            break "other";
        }

    };
     return result;
}

Java 13에서 switch 표현식은 여전히 ​​실험적인 기능이었습니다. 사용 가능하게 하려면 Java 12에서와 마찬가지로 컴파일 및 실행 시 --enable-preview 명령을 사용해야 합니다 . Java 13에서 스위치 의 주요하고 본질적으로 유일한 "혁신"은 break 를 대체한 yield 키워드입니다 .


public String getProductTypeByName(String product) {
    var result = switch (product) {
        case "Apple", "Peach" -> {
            System.out.println("This is a Fruit");
            yield "Fruit";
        }
        case "Raspberry", "Cherry" -> {
            System.out.println("This is a Berry");
            yield "Berry";
        }
        case "Tomato" -> {
            System.out.println("This is a Vegetable");
            yield "Vegetables";
        }
        default -> {
            System.out.println("Other");
            yield "other";
        }

    };
    return result;
}

yieldbreak 의 주요 차이점은 break는 case 문 에서 실행 제어를 반환 하지만 yield는 내부 return 문처럼 작동하는 전체 switch 의 결과를 반환한다는 것입니다 .

Java 14에서는 instanceof 연산자가 변경되었으며 이제 다음과 같이 사용할 수 있습니다.


if (o instanceof String s) {
s.toLowerCase();
}

instanceof 를 사용하여 변수를 확인해야 할 뿐만 아니라 특정 유형으로 캐스트해야 하는 다소 못생긴 옛날 방식 대신에 .


if(s instanceof String) {
((String) s).toLowerCase();
}

이러한 변경 사항은 Java에 패턴 일치 지원을 추가하는 것을 목표로 하는 Amber 프로젝트의 일부입니다.

버전 14의 instanceof 연산자 변경 과 버전 16의 확장 덕분에 패턴 일치가 결국 버전 17에 적용되었습니다. 사실, 현재로서는 미리 보기로만 존재합니다. --enable-preview 로 사용해 볼 수 있습니다 .


public String getObjectType(Object object) {
    return switch (object) {
        case Integer i -> "Integer";
        case Long l -> "Long";
        case String s -> "String";
        default -> object.toString();
    };
}

일반적으로 새 버전이 나올 때마다 언어에 점점 더 흥미로운 기능이 추가되어 Java 개발이 훨씬 더 멋집니다.