Java 주요 버전별 변화 (9~21)

한눈에 보기

Java 9부터 21까지 모듈 시스템, var, 레코드, sealed, 패턴 매칭, 가상 스레드로 이어지는 진화를 LTS 버전 중심으로 정리하고 세 갈래 흐름으로 읽는 법을 제시한다.

최종 업데이트 2026.09.17

Java 9부터 Java 21까지의 변화는 6개월마다 새 버전을 내는 릴리스 주기 전환과 함께 진행되었으며, 모듈 시스템, var 타입 추론, 레코드(Record), sealed 클래스, 패턴 매칭(Pattern Matching), 가상 스레드(Virtual Thread)가 대표적인 기능이다. 이 가운데 기업들이 주로 채택하는 장기 지원(LTS, Long-Term Support) 버전은 Java 11, 17, 21이다. 버전별 핵심 기능과 도입 배경을 흐름으로 이해해 두면 자바 언어가 어떤 방향으로 진화하고 있는지 설명할 수 있다.

Java 9에서 11까지: 모듈과 새 릴리스 체계

Java 9의 가장 큰 변화는 모듈 시스템(Java Platform Module System)이다. JDK 자체가 모듈로 쪼개졌고, module-info.java로 패키지 공개 범위를 선언해 강한 캡슐화를 얻을 수 있게 되었다. 다만 애플리케이션 개발 현장에서의 채택률은 높지 않다. 이 밖에 List.of() 같은 불변 컬렉션 팩터리, 인터페이스의 private 메서드, 대화형 셸 JShell이 추가되었고, G1이 기본 가비지 컬렉터가 되었다.

Java 10은 지역 변수 타입 추론 키워드 var를 도입해 우변에서 타입이 명백할 때 선언을 간결하게 만들었다. var는 컴파일 타임에 타입이 확정되는 정적 타입이며 동적 타입과는 무관하다. LTS인 Java 11은 표준 HTTP 클라이언트(java.net.http.HttpClient)를 정식화해 HTTP/2와 비동기 호출을 지원했고, 단일 소스 파일을 컴파일 없이 java 명령으로 바로 실행하는 기능, String의 isBlank, strip, lines 같은 편의 메서드를 더했다.

Java 12에서 17까지: 문법 현대화

이 구간에서는 데이터 중심 문법이 집중적으로 들어왔다. switch 표현식(Java 14 정식)은 화살표 문법과 yield로 switch가 값을 반환하게 했고 fall-through 실수를 없앴다. 텍스트 블록(Java 15 정식)은 세 개의 큰따옴표로 여러 줄 문자열을 이스케이프 없이 쓰게 했다. Java 16에서는 불변 데이터 캐리어인 레코드와 instanceof 패턴 매칭이 정식화되었다.

// switch 표현식과 record, sealed의 조합
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}

static double area(Shape s) {
    return switch (s) {
        case Circle c -> Math.PI * c.radius() * c.radius();
        case Square sq -> sq.side() * sq.side();
    }; // sealed 덕분에 default 없이도 완전성이 검증된다
}

LTS인 Java 17은 sealed 클래스와 인터페이스를 정식화해 상속 가능한 하위 타입을 permits로 제한할 수 있게 했다. 컴파일러가 하위 타입 전체를 알 수 있어 switch 패턴 매칭의 완전성 검사와 맞물려 대수적 데이터 타입(algebraic data type) 스타일의 모델링이 가능해졌다. JVM 쪽에서는 지연 시간을 극단적으로 줄인 ZGC가 Java 15에서 정식화되었고, Java 17에서 강한 캡슐화가 기본 적용되어 JDK 내부 API에 대한 리플렉션 접근이 차단되었다.

Java 18에서 21까지: 가상 스레드의 시대

LTS인 Java 21의 최대 기능은 가상 스레드다. 운영체제 스레드와 일대일로 묶이던 기존 플랫폼 스레드와 달리, 가상 스레드는 JVM이 스케줄링하는 경량 스레드로 수백만 개를 만들 수 있다. 블로킹 호출을 만나면 캐리어 스레드에서 내려와 다른 가상 스레드에게 자리를 내주므로, 스레드당 요청(thread-per-request) 모델을 유지하면서도 비동기 프레임워크 수준의 처리량을 얻는다.

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 10_000; i++) {
        executor.submit(() -> {
            // 블로킹 IO를 그대로 써도 처리량이 유지된다
            return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
        });
    }
}

Java 21은 이와 함께 switch 패턴 매칭과 레코드 패턴(record pattern)을 정식화해 중첩 데이터 구조를 선언적으로 분해할 수 있게 했고, SequencedCollection 인터페이스로 컬렉션의 순서 관련 API를 정리했다. 세대별 ZGC(Generational ZGC)도 이 버전에 추가되었다. 구조적 동시성(Structured Concurrency)과 영역 값(Scoped Values)은 이 시점에는 프리뷰로 제공되었다.

버전별 핵심 기능 요약

버전구분핵심 기능
9일반모듈 시스템, JShell, 불변 컬렉션 팩터리, G1 기본화
10일반var 지역 변수 타입 추론
11LTSHTTP 클라이언트 정식화, 단일 파일 실행, String 편의 메서드
14일반switch 표현식 정식화, 유용한 NullPointerException 메시지
15일반텍스트 블록 정식화, ZGC 정식화
16일반record 정식화, instanceof 패턴 매칭 정식화
17LTSsealed 정식화, JDK 내부 강한 캡슐화
21LTS가상 스레드, switch 패턴 매칭, 레코드 패턴, 세대별 ZGC

흐름으로 읽는 진화 방향

버전별 기능을 나열식으로 외우기보다 세 갈래 흐름으로 정리하는 편이 좋다. 첫째, record, sealed, 패턴 매칭으로 이어지는 데이터 지향 프로그래밍 강화다. 둘째, 가상 스레드로 대표되는 룸(Loom) 프로젝트의 동시성 단순화다. 셋째, G1과 ZGC로 이어지는 저지연 가비지 컬렉션의 발전이다. 여기에 앰버(Amber, 문법 개선), 파나마(Panama, 네이티브 연동), 발할라(Valhalla, 값 타입) 같은 진행 중인 프로젝트를 덧붙이면 자바의 로드맵 전체를 설명할 수 있다.

면접에서 이렇게 물어본다

  • Java 11, 17, 21 세 LTS 버전의 대표 기능을 각각 꼽고 실무에 어떤 영향을 줬는지 설명해 보라.
  • 가상 스레드가 무엇이고 기존 플랫폼 스레드와 어떻게 다른지, 어떤 문제를 해결하는지 설명해 보라.
  • record와 sealed와 패턴 매칭이 함께 쓰일 때 어떤 설계가 가능해지는지 설명해 보라.
  • var 키워드는 동적 타이핑과 무엇이 다른가.
  • 사용 중인 자바 버전을 올린다면 어떤 기준으로 어떤 기능을 검토하겠는가.
Java 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기