개발/자바

Java 21의 새로운 기능

피터JK 2025. 2. 27. 12:01
728x90

Java 21은 장기 지원(LTS) 릴리스로, 성능 개선과 새로운 기능들이 대거 추가되었습니다.
이번 릴리스에서 주목할 만한 기능들을 살펴보겠습니다.

1. 패턴 매칭 개선 (Pattern Matching)

1.1. Record Patterns (JEP 440, 441)

  • record 타입의 데이터를 더 쉽게 분해할 수 있도록 개선되었습니다.
  • switch 문과 함께 활용하면 더욱 간결한 코드 작성이 가능합니다.
record Point(int x, int y) {}

static void printPoint(Object obj) {
    switch (obj) {
        case Point(int x, int y) -> System.out.println("Point at (" + x + ", " + y + ")");
        default -> System.out.println("Not a point");
    }
}

1.2. Unnamed Patterns & Variables (JEP 443)

  • 사용하지 않는 변수에 _를 사용하여 코드를 간결하게 만들 수 있습니다.
record Data(String name, int age) {}

void process(Data data) {
    if (data instanceof Data(String _, int age)) {
        System.out.println("Age: " + age);
    }
}

2. 문자열 관련 개선

2.1. String Templates (JEP 430, Preview)

  • 문자열 보간(interpolation)을 지원하여 가독성과 성능을 개선할 수 있습니다.
String name = "Java";
int version = 21;
String message = STR."Welcome to \\{name} \\{version}!";
System.out.println(message); // "Welcome to Java 21!"

3. 가비지 컬렉터(GC) 개선

3.1. ZGC 및 G1GC 성능 향상

  • Java 21에서는 ZGC 및 G1GC의 성능이 향상되어 메모리 사용과 GC 시간이 줄어들었습니다.

4. Virtual Threads (가상 스레드) - JEP 444

  • Java 21에서는 가상 스레드(Virtual Threads)가 정식으로 도입되었습니다.
  • Thread.ofVirtual()을 사용하여 가볍고 효율적인 스레드를 생성할 수 있습니다.
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10).forEach(i -> executor.submit(() -> {
        System.out.println("Task " + i + " running on " + Thread.currentThread());
    }));
}

5. Sequenced Collections (JEP 431)

  • List, Set, Map 인터페이스에 순서 기반 메서드가 추가되었습니다.
  • 새로운 메서드: first(), last(), reversed()
SequencedSet<String> set = new LinkedHashSet<>();
set.add("A");
set.add("B");
set.add("C");
System.out.println(set.first()); // A
System.out.println(set.last());  // C

6. Scoped Values (JEP 446, Preview)

  • 스레드 간 안전한 데이터 공유를 위한 ScopedValue API 도입.
static final ScopedValue<String> USER = ScopedValue.newInstance();

void process() {
    ScopedValue.where(USER, "Alice").run(() -> {
        System.out.println("User: " + USER.get());
    });
}

7. 외부 함수 및 메모리 API (JEP 454)

  • JNI(Java Native Interface) 없이 네이티브 코드를 호출할 수 있는 API 지원.
try (Arena arena = Arena.ofConfined()) {
    MemorySegment segment = arena.allocate(100);
    // 네이티브 메모리 할당 및 활용 가능
}

결론

Java 21은 성능 향상, 가독성 개선, 멀티스레딩 최적화 등 다양한 면에서 큰 발전을 이루었습니다.
특히, 가상 스레드와 패턴 매칭의 발전이 개발 생산성을 크게 높여줄 것으로 기대됩니다.

728x90