1.5 자바 21의 새로운 기능 🚀

자바는 계속해서 진화하고 있습니다. 특히 Java 21은 장기 지원(LTS, Long Term Support) 버전으로, 매우 중요하고 강력한 기능들이 대거 추가되었습니다.


1. 가상 스레드 (Virtual Threads) ⚡️

1) 개념

기존의 자바 스레드(뉴스레드)는 운영체제(OS)의 스레드와 1:1로 매핑되는 무거운 자원이었습니다. 가상 스레드는 운영체제 스레드 하나 위에서 수천, 수만 개가 동시에 동작할 수 있는 초경량 스레드입니다.

2) 비유: “고속도로와 드론”

  • 플랫폼 스레드 (기존): 대형 화물 트럭. 한 번 움직일 때마다 비용이 많이 들고, 도로(OS 자원)를 많이 차지합니다.
  • 가상 스레드 (New): 경량 드론. 트럭 짐칸에 수백 개의 드론이 실려 있다가, 필요할 때 날아가서 각자 임무를 수행하고 돌아옵니다.

그림

3) 구조 시각화

graph TD
    OS[운영체제 스레드 (트럭)]
    VT1[가상 스레드 1 (드론)]
    VT2[가상 스레드 2 (드론)]
    VT3[가상 스레드 3 (드론)]
    
    OS --> VT1
    OS --> VT2
    OS --> VT3
    
    style OS fill:#f9f,stroke:#333
    style VT1 fill:#bfb,stroke:#333
    style VT2 fill:#bfb,stroke:#333
    style VT3 fill:#bfb,stroke:#333

2. 순차 컬렉션 (Sequenced Collections) 📚

1) 개념

리스트(List), 셋(Set), 맵(Map) 등 순서가 있는 데이터 구조에서 첫 번째 요소마지막 요소에 쉽게 접근할 수 있는 표준 방법을 제공합니다. 이전에는 컬렉션마다 접근 방법이 제각각이었지만, 이제는 통일되었습니다.

2) 비유: “앞문과 뒷문이 있는 버스”

  • 이전에는 어떤 버스는 앞문만 있고, 어떤 버스는 창문으로 타야 했습니다.
  • 이제는 모든 순서가 있는 버스(컬렉션)에 표준 앞문(getFirst)뒷문(getLast)이 생겼습니다.

그림

예제 코드

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");

// Java 21 이전: 리스트만 get(0), 셋은 iterator... 복잡함
// Java 21 이후:
System.out.println(list.getFirst()); // "Apple"
System.out.println(list.getLast());  // "Banana"

3. 레코드 패턴 (Record Patterns) 📦

1) 개념

객체의 내부 데이터를 분해(Deconstruction)해서 변수에 바로 할당하는 기능입니다. instanceof로 타입을 확인하면서 동시에 필드 값을 추출할 수 있습니다.

2) 비유: “택배 상자 투시”

  • 예전에는 택배 상자를 받고(객체 확인), 칼로 뜯어서(타입 변환), 물건을 꺼내야(필드 접근) 했습니다.
  • 이제는 투시 안경을 쓰고 상자를 보자마자 내용물이 내 손에 쥐어지는 것과 같습니다.

그림

예제 코드

record Point(int x, int y) {}

Object obj = new Point(10, 20);

// Java 21
if (obj instanceof Point(int x, int y)) {
    System.out.println("X=" + x + ", Y=" + y); // x, y 변수 바로 사용 가능!
}

4. Switch 문 개선 (Pattern Matching) 🔀

1) 개념

Switch 문에서 null을 처리할 수 있고, 숫자/문자뿐만 아니라 객체의 타입에 따라 분기할 수 있습니다.

예제 코드

Object obj = "Hello";

String result = switch (obj) {
    case Integer i -> "정수입니다: " + i;
    case String s  -> "문자열입니다: " + s;
    case null      -> "null입니다";
    default        -> "알 수 없음";
};

5. UTF-8 기본 문자셋 채택 🌐

  • 운영체제(윈도우, 맥, 리눅스)마다 달랐던 기본 문자셋이 UTF-8로 통일되었습니다.
  • 이제 한글이 깨지는 문제(MS949 vs UTF-8)가 획기적으로 줄어듭니다.
서브목차