ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 21. Switch Pattern Matching
    BackEnd/Java 2024. 12. 12. 22:00
    반응형

    Switch Pattern Matching

      Java 17 preview, Java 21 정식 기능이 되었습니다.

     

      기존 switch expression의 경우, switch selector에 char / byte / short / int / 문자열 / Enum만 들어갈 수 있었습니다.

      private String calculateTestGrade(int score) {
        return switch (score) { // score: switch selector
          case 5 -> "A";
          case 4, 3 -> "B";
          case 2, 1 -> "C";
          default -> "F";
        };
      }

     

      Java 21. switch pattern matching의 등장으로, switch selector 안에 char / byte / short / int와 더불어 그 어떤 Reference type도 들어갈 수 있게 되었습니다. 또한 case 뒤에 Pattern Matching이 올 수 있습니다. 즉, case Dog dog와 같은 구문을 사용할 수 있습니다.

     

      if - else if를 사용했던 instanceof 분기 처리를 다음과 같이 switch expression으로 바꿀 수 있습니다.

      public String sound(Animal animal) {
        if (animal instanceof Dog dog) {
          return dog.bark();
        } else if (animal instanceof Cat cat) {
          return cat.purr();
        }
        throw new IllegalArgumentException("다른 경우의 수는 존재하지 않습니다.!");
      }
      public String sound(Animal animal) {
        return switch (animal) {
          case Dog dog -> dog.bark();
          case Cat cat -> cat.purr();
          default -> throw new IllegalArgumentException("다른 경우의 수는 존재하지 않습니다.!");
        };
      }
    • Animal 클래스가 sealed 클래스이면 default 라벨 제거도 가능합니다. 컴파일 시점에 Animal 클래스의 하위 타입을 전부 알 수 있기 때문입니다.

     

      추가적으로 switch pattern matching과 함께 when 절을 사용해 추가 조건을 확인할 수도 있습니다.

      public String sound(Animal animal) {
        return switch (animal) {
          case Dog dog when dog.isQuite() -> ""; // when 추가적인 조건
          case Dog dog -> dog.bark();
          case Cat cat -> cat.purr();
        };
      }

     

      switch의 NPE(NullPointerException) 조건도 변경되었습니다. 이전에는 switch selector에 null이 들어오면 바로 NPE가 발생하였으나, 현재는 switch selector에 null이 들어오고 case null이 없을 경우 NPE가 발생합니다.

      public String sound(Animal animal) {
        return switch (animal) {
          case Dog dog -> dog.bark();
          case Cat cat -> cat.purr();
          case null -> ""; // case null, default 와 같이 default와 함께 사용 가능합니다.
        };
      }

     

      sealed 클래스와 switch pattern matching을 활용하여 한 API에서 서로 다른 스펙을 반환해야 하는 경우의 예제 코드는 다음을 참고하시면 됩니다.

    반응형

    'BackEnd > Java' 카테고리의 다른 글

    Java 21. 가상 스레드  (1) 2024.12.15
    Java 18-21. 주요 변경 내용  (0) 2024.12.13
    Java 21. Record Pattern  (0) 2024.12.11
    Java 12-17. 주요 변경 내용  (0) 2024.12.10
    Java 17. Sealed Class  (1) 2024.12.09

    댓글

Designed by Tistory.