Backend/Java

JDK 23: 자바 핵심 변경점 정리

누구세연 2025. 1. 15. 23:18

JDK 23은 자바 언어와 플랫폼의 최신 개선 사항을 포함하여 개발자 생산성과 애플리케이션 성능을 향상시키는 다양한 기능을 도입했습니다. 주요 변경 사항에 대해 알아보겠습니다.👀

 

 

1. 프리미티브 타입에 대한 패턴 매칭 및 switch 문 확장 (JEP 455)

1-1. 패턴 매칭의 확장

기존에는 instanceof 연산자가 참조 타입에서만 동작했지만, JDK 23부터는 프리미티브 타입에서도 사용할 수 있습니다.

int value = 10;
if (value instanceof int i && i > 5) {
    System.out.println("Value는 5보다 큰 정수입니다: " + i);
}

위 코드는 instanceof 연산자로 프리미티브 타입 int를 확인하고, 조건을 추가적으로 결합하여 안전하고 간결한 검사를 수행합니다! 

 

1-2. switch 문 확장

switch 문에서 이제 모든 프리미티브 타입을 직접 처리할 수 있습니다.

float rating = 2.5f;
switch (rating) {
    case 0f -> System.out.println("0 별점");
    case 2.5f -> System.out.println("평균 별점");
    case 5f -> System.out.println("최고 별점");
    default -> System.out.println("유효하지 않은 별점");
}

이전에는 프리미티브 타입에 대해 switch 문을 사용하는 데 제약이 있었지만, 이제 float, double 등 모든 프리미티브 타입을 완벽하게 지원합니다.

 

2. 값 객체(Value Objects) 개선

값 객체(Value Objects)는 불변 데이터 구조를 효율적으로 표현하는 데 사용됩니다. JDK 23에서는 값 객체를 더 쉽게 정의하고 활용할 수 있도록 성능과 사용성을 개선했습니다.

2-1. 값 객체란?

값 객체는 데이터를 표현하기 위해 만들어진 클래스입니다. 상태를 불변으로 유지하며, 오직 데이터 전달 및 표현에만 사용됩니다.

@ValueObject
public class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int x() { return x; }
    public int y() { return y; }
}
  • @ValueObject 어노테이션으로 불변성을 간결하게 선언 가능
  • JVM이 값 객체를 최적화하여 GC(가비지 컬렉션) 비용을 줄이고 성능을 향상
 

3. 문자열 템플릿(String Templates) 정식 도입

JDK 23에서는 문자열 내에서 변수를 삽입하거나, 표현식을 포함할 수 있는 문자열 템플릿(String Templates) 기능이 정식으로 도입되었습니다. 이 기능은 복잡한 문자열 조작 코드를 간결하고 가독성 높게 작성할 수 있도록 합니다.

 

3-1. 기존 방식의 문제

기존에는 문자열을 조합하기 위해 String.format이나 + 연산을 사용했으나, 이 방식은 코드가 복잡하고 오류 발생 가능성이 높았습니다.

int x = 10;
int y = 20;
String message = "The sum of " + x + " and " + y + " is " + (x + y) + ".";
System.out.println(message);

 

3-2. 문자열 템플릿 도입

문자열 템플릿은 변수를 {}로 감싸고, STR 키워드를 사용하여 코드를 단순화합니다.

int x = 10;
int y = 20;
String message = STR."The sum of \{x} and \{y} is \{x + y}.";
System.out.println(message); // 출력: The sum of 10 and 20 is 30.

 

이 방식은 가독성을 향상시키고, 템플릿 표현식의 컴파일 타임 검증을 지원합니다.

 

4. 가상 스레드와 구조화된 동시성 통합

JDK 23에서는 **가상 스레드(Virtual Threads)**와 **구조화된 동시성(Structured Concurrency)**가 더 긴밀하게 통합되었습니다. 이를 통해 동시성 처리가 더욱 직관적이고 효율적으로 개선됩니다.

4-1. 가상 스레드란?

가상 스레드는 JDK 19에서 미리보기로 도입된 기능으로, 기존 OS 스레드보다 경량으로 동작하며 대규모 동시성 처리를 지원합니다.

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> System.out.println("Task 1"));
    executor.submit(() -> System.out.println("Task 2"));
}

 

4-2. 구조화된 동시성

구조화된 동시성은 트랜잭션처럼 작업의 범위와 수명을 명확히 정의합니다. 이를 통해 동시성 작업이 더 안전하고 직관적으로 관리됩니다.

 

5. 네이티브 메모리 추적(Native Memory Tracking) 개선

네이티브 메모리 추적은 JVM 외부 메모리의 사용량을 추적하는 도구입니다. JDK 23에서는 이 기능이 개선되어 성능과 정확성이 크게 향상되었습니다.

 

6. 외부 함수 및 메모리 API 개선

외부 함수 및 메모리(Foreign Function & Memory) API는 JVM 외부 메모리에 대한 액세스를 효율적이고 안전하게 제공합니다. JDK 23에서는 이 API가 성능 최적화와 안전성 강화 측면에서 개선되었습니다.

 

7. 가비지 컬렉션 성능 개선

가비지 컬렉터(GC)의 성능이 추가로 개선되어 메모리 관리 효율성이 크게 향상되었습니다. JDK 23은 GC 성능을 더 정밀하게 제어하고, 지연 시간(Latency)을 줄이는 데 초점을 맞췄습니다.

 

 

 

💡 JDK 23은 자바 언어와 플랫폼의 최신 기능을 도입하여 생산성과 성능을 향상시키고, 개발자가 현대적인 애플리케이션을 더 쉽게 구축할 수 있도록 지원합니다.
이러한 기능들을 잘 활용하면 코드를 더 간결하고 안전하게 작성할 수 있을 뿐만 아니라, 대규모 트래픽이나 복잡한 비즈니스 로직에서도 최적의 성능을 낼 수 있습니다.