개요

Java 23은 2024년 9월에 정식 릴리스되며 패턴 매칭(Pattern Matching)의 대폭 강화를 비롯해 개발자 생산성을 크게 높이는 기능들을 선보였습니다. 특히 JEP 455(Primitive Types in Patterns)와 향상된 switch 표현식은 Java의 타입 시스템을 한 단계 끌어올렸습니다. 이 글에서는 Java 23의 핵심 변경사항을 코드 예제와 함께 살펴봅니다.

핵심 개념

Java의 패턴 매칭은 Java 16의 instanceof 패턴에서 시작해 Java 21의 Record Pattern, Switch Pattern을 거쳐 Java 23에서 완성형에 가까워졌습니다. 주요 변화는 다음과 같습니다.

  • Primitive Types in Patterns (JEP 455): int, long 등 기본 타입도 패턴 매칭에서 직접 사용 가능
  • 향상된 Switch 표현식: guard 패턴(when 절)과 결합한 정교한 분기 처리
  • Unnamed Patterns: 사용하지 않는 바인딩 변수를 _로 대체
  • String Templates (Preview): 문자열 보간 기능의 개선
  • Scoped Values (Preview): ThreadLocal 대체를 위한 불변 스코프 값

실전 예제

기본 타입 패턴 매칭을 활용한 예제입니다. 이전에는 기본 타입에 패턴 매칭을 적용할 수 없어 별도의 캐스팅 코드가 필요했지만, Java 23에서는 직관적으로 처리할 수 있습니다.

// Java 23: Primitive Types in Patterns
public String classify(Object obj) {
    return switch (obj) {
        case Integer i when i > 0  -> "양의 정수: " + i;
        case Integer i when i == 0 -> "영";
        case Integer i             -> "음의 정수: " + i;
        case Double d when d > 0   -> "양의 실수: " + d;
        case String s              -> "문자열: " + s;
        case null                  -> "null 값";
        default                    -> "기타: " + obj.getClass().getSimpleName();
    };
}

// Record Pattern + Unnamed Pattern
record Point(int x, int y) {}
record Line(Point start, Point end) {}

public void processShape(Object shape) {
    switch (shape) {
        case Line(Point(var x1, _), Point(var x2, _))
            when x1 == x2 -> System.out.println("수직선");
        case Line(Point(_, var y1), Point(_, var y2))
            when y1 == y2 -> System.out.println("수평선");
        case Line l -> System.out.println("일반 직선: " + l);
        default -> System.out.println("알 수 없는 도형");
    }
}

Scoped Values를 활용한 컨텍스트 전달 예제입니다.

// Scoped Values - ThreadLocal 대체
private static final ScopedValue<String> USER_ID = ScopedValue.newInstance();

public void handleRequest(String userId) {
    ScopedValue.runWhere(USER_ID, userId, () -> {
        processOrder();    // USER_ID 접근 가능
        sendNotification(); // USER_ID 접근 가능
    });
}

private void processOrder() {
    String userId = USER_ID.get();
    System.out.println("주문 처리: " + userId);
}

활용 팁

  • 패턴 매칭의 when 절을 적극 활용하면 복잡한 if-else 체인을 깔끔한 switch로 대체할 수 있습니다.
  • Unnamed Pattern(_)은 디스트럭처링 시 불필요한 변수 선언을 줄여 가독성을 높입니다.
  • Scoped Values는 Virtual Thread 환경에서 ThreadLocal보다 안전하고 효율적입니다.
  • Preview 기능은 --enable-preview 플래그로 활성화해야 하며, 프로덕션 코드에는 신중하게 적용하세요.
  • Java 23 마이그레이션 시 기존 switch 문을 점진적으로 switch 표현식으로 전환하는 것이 좋습니다.

마무리

Java 23은 패턴 매칭의 완성도를 높이고, Scoped Values와 같은 현대적 동시성 도구를 강화하며 꾸준한 진화를 보여주고 있습니다. 6개월 릴리스 주기 덕분에 개발자는 새로운 기능을 빠르게 체험할 수 있으며, LTS인 Java 21을 기반으로 점진적으로 신기능을 도입하는 전략이 권장됩니다. 패턴 매칭의 발전은 Java가 함수형 프로그래밍 패러다임에 점점 가까워지고 있음을 보여주는 좋은 사례입니다.