JAVA - 버전별 주요 특징과 예시

정리 기준

  • 자바 8부터 25까지의 흐름을 LTS 위주로 묶고, 미리보기/인큐베이터 상태를 함께 표기했다.
  • 코드 예제는 해당 버전에서 동작하도록 작성했고, 미리보기 기능은 --enable-preview 플래그가 필요하다.

Java 8 (2014, LTS)

람다, Stream API, Optional, 새로운 java.time 패키지가 등장해 함수형 스타일과 안전한 시간 처리의 기반이 마련되었다. 인터페이스에 default/static 메서드를 둘 수 있어 라이브러리 진화도 쉬워졌다.

List<String> names = Arrays.asList("Java", "Kotlin", "Scala");
List<String> upper = names.stream()
.filter(s -> s.startsWith("J"))
.map(String::toUpperCase)
.collect(Collectors.toList());

Java 9 (2017)

프로젝트 지그소로 JDK 자체와 애플리케이션을 모듈화할 수 있게 되었고, JShell 덕분에 REPL 실험이 편해졌다. HTTP 클라이언트가 인큐베이터로 공개되어 이후 표준화의 발판을 마련했다.

// module-info.java
module com.example.app {
requires com.example.service;
exports com.example.app.api;
}

Java 10 (2018)

지역 변수 타입 추론 var가 추가되어 선언은 간결해졌지만, 제네릭 타입 정보는 컴파일 타임에 유지된다.

var map = new HashMap<String, Integer>();
map.put("age", 30);

Java 11 (2018, LTS)

HTTP 클라이언트가 정식 표준이 되었고, var를 람다 파라미터에도 쓸 수 있어 어노테이션과 조합하기 좋아졌다. 문자열/파일 처리 유틸리티가 늘어나 스크립트처럼 간단히 코드를 짤 수 있다.

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://example.com")).build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());

Java 1214 (20192020)

스위치가 식 형태로 진화(미리보기)하며 가독성이 크게 개선됐고, 텍스트 블록(미리보기)으로 멀티라인 문자열 작성이 편해졌다. 레코드와 instanceof 패턴 매칭이 미리보기로 등장해 데이터 클래스를 간결히 표현하는 흐름이 시작됐다.

String json = """
{
"lang": "Java",
"version": 21
}
""";

String result = switch (day) {
case MON, TUE, WED -> "Weekday";
case THU, FRI -> "Almost weekend";
default -> "Weekend";
};

Java 1516 (20202021)

텍스트 블록이 정식으로 굳어지고, Sealed Class가 미리보기로 소개되었다(17에서 완성). 16에서 레코드와 instanceof 패턴 매칭이 정식화되며 패턴 기반 모델링이 본격화됐다. 벡터 API는 인큐베이터로 HPC 성능을 겨냥한다.

public sealed interface Shape permits Circle, Rectangle {}
public record Circle(double radius) implements Shape {}
public record Rectangle(double w, double h) implements Shape {}

static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.w() * r.h();
};
}

Java 17 (2021, LTS)

Sealed Class가 정식이 되어 상속 트리를 안전하게 제한할 수 있고, 스위치 패턴 매칭은 미리보기로 확장되었다. 보안·GC가 강화되며 LTS 업그레이드의 안정판 역할을 한다.

sealed interface Command permits Start, Stop {}
record Start(String target) implements Command {}
record Stop() implements Command {}

static String handle(Command cmd) {
return switch (cmd) {
case Start s -> "start " + s.target();
case Stop _ -> "stop";
};
}

Java 18~19 (2022)

18은 기본 문자셋을 UTF-8로 통일하고, 간단한 정적 서버와 JFR 이벤트 스트리밍 개선을 제공했다. 19에서는 Project Loom의 가상 스레드, 기록 패턴, Foreign Function & Memory(FFM) API가 미리보기로 공개되어 동시성과 네이티브 연동의 큰 변곡점을 예고했다.

Thread.startVirtualThread(() -> {
System.out.println("lightweight task");
});

Java 20 (2023)

가상 스레드와 기록 패턴이 2차 미리보기로 다듬어졌고, 스코프드 값과 구조적 동시성(인큐베이터)이 등장해 스레드 로컬 한계를 넘는 맥락 전달과 태스크 단위 취소/전파 모델을 제시했다.

Java 21 (2023, LTS)

가상 스레드·스위치 패턴 매칭·기록 패턴이 정식으로 안정화되며, 동시성과 패턴 매칭이 현업에서도 쓸 만한 수준이 되었다. 순서가 보장된 컬렉션 뷰(SequencedCollection)와 GC 개선으로 런타임 품질을 높였고, 문자열 템플릿과 스코프드 값은 미리보기로 실험을 이어간다.

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> user = scope.fork(() -> fetchUser());
Future<List<String>> orders = scope.fork(() -> fetchOrders());
scope.join().throwIfFailed();
System.out.println(user.result() + orders.result());
}

Java 22 (2024)

FFM API가 정식으로 자리 잡아 네이티브 라이브러리 호출과 안전한 메모리 접근을 공식 지원한다. 스코프드 값·구조적 동시성은 추가 미리보기로 안정성을 높였고, 스트림 Gatherer(미리보기)와 문자열 템플릿 2차 미리보기로 표현력을 확장한다.

Java 23 (2024)

언네임드 클래스/인스턴스 메인 메서드(미리보기)로 교육·스크립팅 진입 장벽을 낮췄고, Class-File API(미리보기)로 바이트코드 조작을 표준화하려는 움직임이 시작됐다. 문자열 템플릿과 Vector API도 후속 미리보기/인큐베이터를 거치며 사용성을 다듬는다.

Java 24 (2025, 예정)

GA 전이므로 구성은 변동될 수 있으나, 23에서 미리보기였던 기능들의 정식화 여부와 루미나리/파나마 계열(가상 스레드, 구조적 동시성, FFM) 추가 다듬기가 핵심 체크포인트다. 실제 포함 기능은 릴리스 노트와 JEP 목록을 확인해야 한다.

Java 25 (2025, 예정)

현재 계획 단계다. 통상 23~24에서 미리보기·인큐베이터였던 기능들의 정식화와 JVM 성능 최적화가 예상되지만, 실제 포함 기능은 GA 직전 확정된다. 릴리스 직후 JEP 목록을 반영해 내용을 업데이트하는 것이 안전하다.

최신 버전 선택 가이드

  • 장기 지원이 필요하면 17 → 21 LTS 전환을 권장(가상 스레드 등 최신 런타임 이점).
  • 신규 개발은 21 LTS를 기본으로 하고, FFM·문자열 템플릿·스코프드 값 등 미리보기 기능은 --enable-preview로 시험 후 채택한다.
  • 기존 8/11 서비스는 빌드 파이프라인을 모듈화/통합 로깅/GC 옵션으로 점진 이관하는 것이 안전하다.
  • 22 이후 릴리스는 미리보기·인큐베이터 변동이 잦으니 GA 시점 JEP 목록을 확인해 의존성을 잠근다.
Share