PSD( Private-Self-Development )

JAVA 21 변경점 본문

Backend/JAVA

JAVA 21 변경점

chjysm 2026. 1. 27. 17:29

JAVA 21은 가장 중요한 성능에 큰 개선이 이루어진 아주 중요한 버전이다.

 

1. Virtual Threads

java 21 의 알파이자 오메가 

 

기존 

  • 자바 스레드 1개 = OS 스레드 1개 
  • 생성 비용이 비싸고 개수 제한이 있음
  • IO작업(DB, 네트워크) 을 대기 시 스레드가 멈춤 (블로킹) 

Virtual Threads

  • 자바 스레드 N개 = OS 스레드 1개
  • 생성 비용이 거의 없음, 개수 제한 없음 
  • IO작업(DB, 네트워크) 을 대기 시 즉시 다른 가상 스레드가  OS 스레드 점유 (논블로킹)
  • 주의! 가상스레드가 블로킹 되는 경우가 있는데 synchronized 블록안에 있으면 블로킹되어 버림
    사용하는 대부분 라이브러리에서 synchronized 를 걷어내는 처리가 되었지만 최신버전으로 유지해야함 
// 기존
ExecutorService executor = Executors.newFixedThreadPool(200);

// 가상 스레드 방식
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 100_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(1000); // 이때 대기하지 않고 다른일 시작
            return i;
        });
    });
}

 

 

2. 순서가 있는 컬렉션의 통합

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");

// 기존
String first = list.get(0);
String last = list.get(list.size() - 1);

// Java 21 
String first = list.getFirst();
String last = list.getLast();

list.addFirst("Start"); // 앞에 추가
list.addLast("End");    // 뒤에 추가
List<String> reversed = list.reversed(); // 역순 변환

 

 

3. instanceof  의  record  내부 변수 자동 분해 지원

// 기존
if (obj instanceof Point p) {
    int x = p.x(); // getter 호출 필요
    int y = p.y();
}

// Java 21 (내부 값까지 바로 분해)
if (obj instanceof Point(int x, int y)) {
    System.out.println(x + ", " + y);
}

 

4. Switch 문에서 null 값 분기로 사용 가능 

String result = switch (obj) {
    case Integer i -> String.format("숫자입니다: %d", i);
    case String s  -> "문자열입니다: " + s;
    case null      -> "널입니다!"; // 드디어 null case 지원! (NPE 방지)
    default        -> "모르는 타입";
};

 

'Backend > JAVA' 카테고리의 다른 글

JAVA 17 변경점  (0) 2026.01.27
JAVA 11 변경점  (0) 2026.01.27
JAVA 8 변경점  (0) 2026.01.27
가비지 컬렉션(Garbage Collection)  (0) 2023.07.12
생성자 주입을 사용하는 이유  (0) 2023.01.30