codingstairs
노트에듀라이프연락
⌕검색⌘K
koen

Navigation

  • Intro
  • Blog
  • Life

연락하기

로그인 없이도 보낼 수 있어요. 답변이 필요하면 이메일을 함께 적어 주세요.

  • 익명 폼으로 의견 남기기 →
  • ✉ warragon112@gmail.com
  • 카카오톡 오픈채팅 ↗

© 2026 codingstairs

  • 노트
  • 에듀
  • 검색
  • 라이프
  • 연락
  • 약관
  • RSS
  • GitHub
노트›languages

Java 21 의 모습

2026-04-28 게시· 2026-05-18 갱신·0회 조회

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 를 참고합니다.

languages 카테고리의 다른 글

카테고리 전체 보기 →
  • Rust — Tauri 가 Rust 인 이유
  • Python 과 비동기 (asyncio)
  • TypeScript 와 strict 모드