Java 21 의 모습
Java 21 의 모습
Java 는 1995 년에 첫 공개된 이후 30 년 가까이 살아온 언어. 이 글은 Java 의 흐름 · LTS 사이클 · Java 21 에서 의미가 있는 기능 몇 가지를 사실 기준으로. GraalVM, Kotlin · Scala 같은 이웃 언어와의 관계도 짧게.
1. Java 에 대한 이야기
Sun Microsystems 의 James Gosling 팀이 만든 언어. 첫 공식 릴리스는 1995 년 5월 (JDK 1.0 은 1996 년 1월). 2010 년 Sun 이 Oracle 에 인수되며 Oracle 이 주된 후원자가 됨. 같은 해 OpenJDK 가 GPLv2 + Classpath Exception 으로 오픈소스화 (2007 년 시작, 2010 년 무렵 사실상 표준화), 오늘날 대부분의 배포판 (Oracle JDK · Eclipse Temurin · Amazon Corretto · Microsoft Build of OpenJDK · Azul Zulu) 이 OpenJDK 를 기반.
2. 컴파일과 실행
.java 소스는 javac 가 바이트코드 (.class) 로 컴파일. JVM 이 그 바이트코드를 읽어 실행하는데, 동작 중에 자주 쓰이는 메서드를 JIT (Just-In-Time) 으로 네이티브 코드로 변환해 가속. HotSpot JVM 이 사실상 기본 구현.
3. LTS 사이클
2017 년부터 Java 는 6 개월마다 새 버전을 내고 그 가운데 일부를 LTS (Long-Term Support) 로 지정:
| 버전 | 출시 | 비고 |
|---|---|---|
| 8 | 2014 | 람다 · Stream API. 가장 오래 머문 LTS. |
| 11 | 2018 | LTS. var 로컬 추론 (10) 포함. |
| 17 | 2021 | LTS. record 정식 · sealed class. |
| 21 | 2023-09 | LTS. virtual threads · pattern matching for switch. |
| 25 | 2025-09 | LTS 예정. |
LTS 사이에 끼는 버전 (12 ~ 16, 18 ~ 20, 22 ~ 24) 은 6 개월 주기 피처 릴리스.
4. Java 21 의 기능
record (14 미리보기 → 16 정식) — 불변 데이터 클래스를 한 줄로:
record Point(int x, int y) {}
var p = new Point(3, 4);
p.x(); // 자동 접근자
sealed class (15 미리보기 → 17 정식) — 허용 하위 클래스를 명시. 패턴 매칭과 결합해 컴파일러가 분기 누락을 잡음:
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
pattern matching for switch (21 정식):
double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.r() * c.r();
case Square q -> q.s() * q.s();
};
}
sealed 와 record 를 함께 쓰면 default 없이도 컴파일러가 누락을 잡아줌.
virtual threads (Project Loom, 21 정식) — 하나의 OS 스레드가 수많은 가상 스레드를 협력적으로 실행. I / O 대기에서 자동으로 양보 (unmount):
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> { /* blocking I/O 가능 */ });
}
스레드당 메모리 수십 MB 였던 비용이 KB 수준으로 떨어진다고 알려짐. blocking 코드를 그대로 둔 채 동시성을 늘리는 길로 자주.
5. GC
JVM 은 여러 GC:
- G1 — 21 까지 기본. 처리량과 일시정지 사이의 균형.
- ZGC (15+) · Shenandoah (12+) — 일시정지를 수 ms 이하로 유지하려는 저지연 GC.
- Parallel · Serial — 전통적 단순 GC. 작은 환경.
선택은 워크로드에 따름. 큰 힙 · 낮은 일시정지가 필요하면 ZGC 가 자주.
6. 다른 길
| 언어 | 첫 릴리스 | 비고 |
|---|---|---|
| Java | 1995 | JVM 표준. |
| Kotlin | 2011 (1.0 2016) | JetBrains. JVM / Native / JS / Wasm. Android 공식 권장 (2017). |
| Scala | 2004 | EPFL. 함수형 + OO. 학술 · 데이터 진영. |
| Groovy | 2003 | 동적 JVM 언어. Gradle 빌드 스크립트로 살아 있음. |
| Clojure | 2007 | Lisp 계열 JVM 언어. |
Kotlin 은 nullability 를 타입에 새기고 코루틴을 표준 라이브러리로 가짐. Scala 3 (2021) 는 매크로 · 타입 시스템을 더 깊게. 셋 다 JVM 바이트코드로 컴파일되어 Java 라이브러리를 그대로 쓸 수 있음.
7. GraalVM
Oracle Labs 가 발표한 폴리글랏 런타임. 첫 공식 GA 는 2019 년 (2018 년부터 공개 작업). 두 가지로 자주:
- JIT 대체 — HotSpot 에 GraalVM JIT 를 끼워 더 공격적으로 최적화.
- Native Image — AOT 로 정적 네이티브 바이너리. 시작 시간 수십 ms 수준, 메모리 수 MB 수준이 가능. 단 리플렉션 · 동적 클래스 로딩에 별도 설정 필요.
Spring Boot 3 (2022) · Micronaut · Quarkus 가 GraalVM Native Image 를 1 급 시민으로 지원.
8. 빌드와 버전 관리
# Windows · macOS 동일
./gradlew build # macOS · Linux · Git Bash
gradlew.bat build # Windows cmd
./gradlew bootRun # Spring Boot 실행
Java 버전 관리:
- SDKMAN! (macOS · Linux) —
sdk install java 21.0.5-tem - Scoop · winget (Windows) —
winget install EclipseAdoptium.Temurin.21.JDK
JAVA_HOME 을 정확히 가리키게 하는 것이 일관된 빌드의 출발점.
9. 자주 걸리는 자리
JDK 와 JRE — 21 부터 Oracle 은 별도 JRE 배포를 사실상 중단. JDK 만 받으면 됨.
모듈 시스템 (JPMS, 9+) 과 클래스패스의 공존 — module-info.java 도입은 라이브러리 호환에 따라 신중하게.
virtual thread + synchronized — 21 시점에는 synchronized 블록이 가상 스레드를 OS 스레드에 고정 (pinning) 시켜 이점이 사라질 수 있음. ReentrantLock 권장. 25 에서 개선이 진행 중.
리플렉션과 Native Image — AOT 컴파일은 동적 동작을 미리 알아야 함. reflect-config.json 또는 @Reflective 같은 메타데이터 필요.
GC 튜닝의 함정 — 옵션을 많이 만지기 전에 워크로드 측정이 먼저. 기본값이 잘 맞는 경우가 많음.
하고픈 말
Java 21 의 record · sealed · pattern matching for switch · virtual threads 의 결합이 모던 Java 의 큰 도약. 8 시대의 람다 + Stream API 도약과 비슷한 무게. virtual threads 는 blocking 코드를 그대로 두고 동시성을 늘리는 길이라 운영 가치가 큼. GraalVM Native Image 는 시작 시간 + 메모리가 절실한 자리 (서버리스 · CLI) 에서 점차 도입.
Next
- python-async
- rust-for-tauri
OpenJDK · OpenJDK GitHub · Oracle Java Documentation · JEPs (JDK Enhancement Proposals) · GraalVM · Eclipse Temurin · SDKMAN! · Kotlin · Scala 를 참고합니다.