Java 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 Main

instanceof에서 원시 타입 패턴

// 기존 방식 - 수동 캐스팅 필요
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 플래그 필수