-
Java 21. Switch Pattern MatchingBackEnd/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