Contents
see ListJava 24 Pattern Matching 개요
Java 24(JDK 24)에서 Pattern Matching이 원시 타입(primitive type)까지 확장되었습니다. 이전까지 instanceof와 switch의 패턴 매칭은 참조 타입에만 적용되었지만, Java 24 Preview Feature로 int, long, double 등 모든 원시 타입에서 패턴 매칭을 사용할 수 있습니다.
활성화 방법
Preview Feature이므로 컴파일과 실행 시 모두 플래그가 필요합니다.
# 컴파일
javac --enable-preview --release 24 Main.java
# 실행
java --enable-preview Maininstanceof에서 원시 타입 패턴
// 기존 방식 - 수동 캐스팅 필요
Object value = 42;
if (value instanceof Integer) {
int num = (Integer) value;
System.out.println("정수: " + num);
}
// Java 24 - 원시 타입 패턴 매칭
Object value = 42;
if (value instanceof int num) {
System.out.println("정수: " + num); // 자동 언박싱 + 바인딩
}switch에서 원시 타입 패턴
switch 표현식에서 원시 타입별로 분기할 수 있습니다.
// Java 24 switch에서 원시 타입 패턴
static String classify(Object obj) {
return switch (obj) {
case int i when i > 0 -> "양의 정수: " + i;
case int i when i < 0 -> "음의 정수: " + i;
case int i -> "영";
case long l -> "long 값: " + l;
case double d when d != d -> "NaN";
case double d -> "실수: " + d;
case String s -> "문자열: " + s;
case null -> "null";
default -> "기타: " + obj;
};
}
// 사용 예시
System.out.println(classify(42)); // "양의 정수: 42"
System.out.println(classify(-7)); // "음의 정수: -7"
System.out.println(classify(3.14)); // "실수: 3.14"
System.out.println(classify("hello")); // "문자열: hello"가드 패턴(Guarded Pattern) 활용
// when 절로 조건부 매칭
static String gradeScore(int score) {
return switch (score) {
case int s when s >= 90 -> "A";
case int s when s >= 80 -> "B";
case int s when s >= 70 -> "C";
case int s when s >= 60 -> "D";
case int s -> "F";
};
}
// 범위 검증
static void validatePort(int port) {
switch (port) {
case int p when p >= 1 && p <= 1023 ->
System.out.println("Well-known port: " + p);
case int p when p >= 1024 && p <= 49151 ->
System.out.println("Registered port: " + p);
case int p when p >= 49152 && p <= 65535 ->
System.out.println("Dynamic port: " + p);
default ->
throw new IllegalArgumentException("Invalid port: " + port);
}
}Record와 결합
record Point(int x, int y) {}
record Circle(Point center, double radius) {}
static String describeShape(Object shape) {
return switch (shape) {
case Circle(Point(int x, int y), double r) when r > 100 ->
"큰 원 at (" + x + "," + y + ") r=" + r;
case Circle(Point(int x, int y), double r) ->
"원 at (" + x + "," + y + ") r=" + r;
default -> "알 수 없는 도형";
};
}핵심 정리
- Java 24에서 원시 타입 패턴 매칭 Preview로 도입
- instanceof와 switch 모두에서 int, long, double 등 사용 가능
- when 가드 절로 조건부 매칭 지원
- Record 패턴과 결합하여 중첩 구조 분해 가능
- --enable-preview 플래그 필수