자바 버전 역사

자바 언어는 JDK 1.0 이후 여러 차례 변경되었으며, 표준 라이브러리에 수많은 클래스와 패키지가 추가되었다. J2SE 1.4부터 자바 언어의 발전은 자바 커뮤니티 프로세스 (JCP)에 의해 관리되었으며, JCP는 Java Specification Request (JSR)를 사용하여 자바 플랫폼에 추가 및 변경 사항을 제안하고 지정한다. 이 언어는 Java Language Specification (JLS)에 의해 명시되며, JLS의 변경 사항은 JSR 901에 따라 관리된다. 2017년 9월, 자바 플랫폼의 수석 아키텍트인 마크 라인홀트는 당시 2년 주기 대신 "6개월마다 한 번의 기능 릴리스"로 릴리스 주기를 변경할 것을 제안했다. 이 제안은 이후 모든 버전에 적용되었으며, 현재도 이 릴리스 일정을 따르고 있다.

언어 변경 외에도 자바 클래스 라이브러리에도 수년에 걸쳐 변경이 이루어졌으며, JDK 1.0의 수백 개의 클래스에서 J2SE 5의 삼천 개 이상의 클래스로 성장했다. 스윙 및 자바2D와 같은 완전히 새로운 API들이 도입되었으며, 원래 JDK 1.0 클래스와 메서드 중 많은 부분이 더 이상 사용되지 않게 되었고, 제거된 API는 거의 없다(최소한 자바 22에서는 스레딩을 위한 API 하나가 제거되었다). 일부 프로그램은 자바 플랫폼의 한 버전에서 이전 버전으로 자바 프로그램을 변환할 수 있도록 한다(예: 자바 5.0을 1.4로 백포트). (참조: 자바 백포팅 도구)

오라클의 자바 SE 지원 로드맵에 따르면, 자바 SE 25 (LTS)가 2025년 9월 현재 최신 버전이며, 버전 21, 17, 11 및 8은 여전히 지원되는 (장기 지원 버전 − LTS) 버전으로, 오라클 고객은 오라클 프리미어 지원을 받게 된다. 오라클은 개발 및 개인용으로 자바 8에 대한 무료 공개 업데이트를 무기한으로 계속 제공한다.

OpenJDK의 경우, 광범위한 커뮤니티의 여러 조직에서 상업적 장기 지원 및 자유 소프트웨어 업데이트를 모두 제공한다.

자바 25는 2025년 9월 16일에 출시되었다.

## 릴리스 표

## JDK 1.0

첫 번째 버전은 1996년 1월 23일에 출시되었다. 첫 번째 안정 버전인 JDK 1.0.2는 자바 1이라고 불린다.

포함된 내용은 다음과 같다.

* 코어 언어 기능 (java.lang의 기본 자바 자료형, java.util의 유틸리티 클래스)
* 그래픽 지원 (AWT 프레임워크)
* 자바 애플릿 생성 지원
* I/O 및 네트워킹 라이브러리

## JDK 1.1

1997년 2월 19일 릴리스의 주요 추가 사항은 다음과 같다.
* 애브스트랙트 윈도 툴킷 (AWT) 이벤트 모델의 광범위한 재구성
* 언어에 내부 클래스 추가
* 자바빈즈
* 자바 데이터베이스 연결 (JDBC) 및 SQL 지원
* 자바 원격 메서드 호출 (RMI) 및 직렬화
* 리플렉션 (인트로스펙션만 지원했으며 런타임에 수정은 불가능했다.) (J2SE 1.2에서  클래스와  클래스와 같은 서브클래스를 도입하여 객체를 리플렉션으로 수정하는 기능이 추가되었다.)
* 저스트 인 타임 컴파일 (JIT), 마이크로소프트 윈도우 플랫폼용으로 시만텍이 자바소프트를 위해 제작
* 탈리전트에서 시작된 국제화 및 유니코드 지원

## J2SE 1.2

1998년 12월 8일 릴리스 및 J2SE 5.0까지의 후속 릴리스는 소급적으로 **자바 2**로 리브랜딩되었으며, 기본 플랫폼을 J2EE (자바 2 플랫폼, 엔터프라이즈 에디션) 및 J2ME (자바 2 플랫폼, 마이크로 에디션)와 구별하기 위해 버전 이름 "J2SE" (자바 2 플랫폼, 스탠더드 에디션)가 JDK를 대체했다. 이는 59개의 패키지에 1520개의 클래스로 자바 플랫폼 크기를 3배로 늘린 매우 중요한 자바 릴리스였다. 주요 추가 사항은 다음과 같다.
* `strictfp` 키워드 (JVM 17에 의해 더 이상 사용되지 않는 키워드이므로 새 코드에서는 사용해서는 안 된다)
* 스윙 그래픽 API가 코어 클래스에 통합되었다.
* 선의 JVM은 처음으로 JIT 컴파일러를 장착했다.
* 자바 플러그인
* CORBA 상호 운용성을 위한 IDL 구현인 자바 IDL
* 컬렉션 프레임워크

## J2SE 1.3

2000년 5월 8일 릴리스에서 가장 주목할 만한 변경 사항은 다음과 같다.
* 핫스팟 JVM 포함 (핫스팟 JVM은 J2SE 1.2 JVM용으로 1999년 4월에 처음 출시되었다)
* RMI는 CORBA와의 선택적 호환성을 지원하도록 수정되었다.
* 자바 네이밍 및 디렉터리 인터페이스 (JNDI)가 코어 라이브러리에 포함되었다 (이전에는 확장으로 사용 가능).
* 자바 플랫폼 디버거 아키텍처 (JPDA)
* 자바사운드
* 합성 프록시 클래스

자바 1.3은 마이크로소프트 윈도우 95를 공식적으로 지원하는 마지막 자바 릴리스이다.

## J2SE 1.4

2002년 2월 6일 릴리스는 자바 커뮤니티 프로세스의 JSR 59에 따라 개발된 첫 번째 자바 플랫폼 릴리스이다. 주요 변경 사항은 다음과 같다.
* 언어 변경
** `assert` 키워드 (JSR 41에 명시됨)
* 라이브러리 개선
** 펄 정규 표현식을 모델로 한 정규 표현식
** 예외 체인을 통해 예외가 원본 하위 수준 예외를 캡슐화할 수 있다.
** IPv6 (Internet Protocol version 6) 지원
** 논블로킹 I/O (NIO라고 명명됨) (JSR 51에 명시됨)
** 로깅 API (JSR 47에 명시됨)
** JPEG 및 이식 가능한 네트워크 그래픽과 같은 형식으로 이미지를 읽고 쓰는 이미지 I/O API
** 통합된 XML 파서 및 XSLT 프로세서 (JAXP) (JSR 5 및 JSR 63에 명시됨)
** 통합된 보안 및 암호화 확장 (JCE, JSSE, 자바 인증 및 권한 부여 서비스)
** 자바 웹 스타트 포함 (자바 웹 스타트는 J2SE 1.3용으로 2001년 3월에 처음 출시되었다) (JSR 56에 명시됨)
** 환경 설정 API (`java.util.prefs`)
자바 1.4에 대한 공개 지원 및 보안 업데이트는 2008년 10월에 종료되었다. 오라클 고객을 위한 유료 보안 업데이트는 2013년 2월에 종료되었다.

## Java SE 5

2004년 9월 30일 릴리스는 원래 1.5로 번호가 매겨졌으며, 이는 여전히 내부 버전 번호로 사용된다. 이 번호는 "J2SE의 성숙도, 안정성, 확장성 및 보안 수준을 더 잘 반영하기 위해" 변경되었다. 이 버전은 JSR 176에 따라 개발되었다.

자바 SE 5는 2008년 4월 8일에 공개 업데이트 기간이 시작되었으며, 2009년 11월 3일부로 더 이상 공개 업데이트를 제공하지 않는다. 유료 오라클 고객에게는 2015년 5월까지 업데이트가 제공되었다.

타이거는 몇 가지 중요한 새로운 언어 기능을 추가했다.
* 제네릭: 컬렉션에 대해 컴파일 시간 (정적) 자료형 안전성을 제공하고 대부분의 형 변환이 필요 없게 한다 (JSR 14에 명시됨).
* 메타데이터: 애너테이션이라고도 불린다. 클래스 및 메서드와 같은 언어 구성에 추가 데이터를 태그할 수 있게 하며, 이 데이터는 메타데이터 인식 유틸리티에 의해 처리될 수 있다 (JSR 175에 명시됨).
* 오토박싱/언박싱: `int`와 같은 기본 자료형과 와 같은 기본 래퍼 클래스 간의 자동 변환 (JSR 201에 명시됨).
* 열거형: `enum` 키워드는 자료형 안전한, 정렬된 값 목록(예: `Day.MONDAY`, `Day.TUESDAY` 등)을 생성한다. 이전에는 자료형 안전하지 않은 상수 정수나 수동으로 구성된 클래스(자료형 안전 열거형 패턴)로만 달성할 수 있었다 (JSR 201에 명시됨).
* 가변인자: 메서드의 마지막 매개변수는 이제 자료형 이름 뒤에 세 개의 점(예: `void drawtext(String... lines)`)을 사용하여 선언할 수 있다. 호출 코드에서는 해당 자료형의 매개변수를 원하는 만큼 사용할 수 있으며, 이들은 배열에 담겨 메서드로 전달되거나, 또는 호출 코드에서 해당 자료형의 배열을 전달할 수 있다.
* 향상된 `for each` 루프: `for` 루프 구문은 배열 또는 표준  클래스와 같은 모든 의 각 멤버를 반복하는 특수 구문으로 확장된다 (JSR 201에 명시됨).
* 다중 스레드 자바 프로그램의 개선된 실행 시맨틱; 새로운 자바 메모리 모델은 이전 사양의 복잡성, 효율성 및 성능 문제를 해결한다.
* 정적 임포트

표준 라이브러리에도 다음과 같은 개선 사항이 있었다.
* RMI 객체에 대한 자동 스텁 생성
* 스윙: 스킨 변경 가능한 새로운 룩 앤드 필, 신스라고 불린다.
* 패키지 `java.util.concurrent`의 동시성 유틸리티
* 다양한 입력 스트림 및 버퍼에서 데이터를 파싱하기 위한 스캐너 클래스

자바 5는 마이크로소프트 윈도우 98 및 윈도우 ME를 공식적으로 지원하는 마지막 자바 릴리스이며, 윈도우 비스타는 자바 SE 5가 2009년 10월에 지원 종료되기 전에 지원되었던 최신 윈도우 버전이다.

자바 5 업데이트 5 (1.5.0_05)는 윈도우 95 (인터넷 익스플로러 5.5 설치된) 및 윈도우 NT 4.0에서 작동하는 마지막 자바 릴리스이다.

자바 5는 애플 맥 OS X 10.4 (타이거)에서 처음 사용할 수 있었으며 애플 맥 OS X 10.5 (레오파드)에 기본으로 설치된 자바 버전이었다.

자바 1.5에 대한 공개 지원 및 보안 업데이트는 2009년 11월에 종료되었다. 오라클 고객을 위한 유료 보안 업데이트는 2015년 4월에 종료되었다.

### 버전 변경
이 버전은 자바 언어에 대한 새로운 버전 관리 시스템을 도입했지만, 개발자 라이브러리에는 이전 버전 관리 시스템이 계속 사용되었다.

이러한 대응은 이후 릴리스(Java 6 = JDK 1.6, Java 7 = JDK 1.7 등)를 통해 계속되었다.

## Java SE 6

2006년 12월 11일에 릴리스된 버전부터 선은 "J2SE"라는 이름을 **자바 SE**로 바꾸고 버전 번호에서 ".0"을 삭제했다. 개발자를 위한 내부 번호는 1.6.0으로 유지된다.

이 버전은 JSR 270에 따라 개발되었다.

개발 단계에서 개선 사항 및 버그 수정이 포함된 새로운 빌드가 약 일주일마다 릴리스되었다. 베타 버전은 2006년 2월과 6월에 릴리스되었으며, 2006년 12월 11일에 최종 릴리스가 이루어졌다.

이 버전에 포함된 주요 변경 사항은 다음과 같다.
* 이전 Win9x 버전 지원 중단; 비공식적으로 자바 6 업데이트 7이 이러한 윈도우 버전에서 작동하는 것으로 나타난 마지막 자바 릴리스였다. 이는 업데이트 10의 주요 변경 사항 때문으로 추정된다.
* 스크립팅 언어 지원 (JSR 223): 스크립팅 언어와의 긴밀한 통합을 위한 일반 API 및 모질라 자바스크립트 라이노 통합이 내장되어 있다.
* 코어 플랫폼, 및 스윙의 극적인 성능 향상.
* JAX-WS (JSR 224)를 통한 웹 서비스 지원 개선.
* 자바 데이터베이스 연결 4.0 지원 (JSR 221).
* 자바 컴파일러 API (JSR 199): 자바 프로그램이 자바 컴파일러를 프로그래밍 방식으로 선택하고 호출할 수 있도록 하는 API.
* JAXB를 버전 2.0으로 업그레이드: StAX 파서 통합 포함.
* 플러그형 애너테이션 지원 (JSR 269).
* API에 스윙워커 통합, 테이블 정렬 및 필터링, 진정한 스윙 더블 버퍼링 (회색 영역 효과 제거)과 같은 많은 GUI 개선 사항.
* JVM 개선 사항에는 다음이 포함된다: 동기화 및 컴파일러 성능 최적화, 새로운 알고리즘 및 기존 쓰레기 수집 알고리즘 업그레이드, 애플리케이션 시작 성능.

자바 6는 64비트 (코어 2 듀오 이상) 프로세서 머신에서 실행되는 Mac OS X 10.5 (레오파드)에 설치할 수 있다. 자바 6는 Mac OS X 10.6 (스노우 레오파드)를 실행하는 32비트 및 64비트 머신 모두에서 지원된다.

자바 6은 2013년 2월에 지원 수명이 종료되었으며, 이때 모든 공개 업데이트(보안 업데이트 포함)가 중단될 예정이었다. 오라클은 2013년 3월과 4월에 자바 6에 대한 두 가지 추가 업데이트를 릴리스했으며, 이는 일부 보안 취약점을 패치했다.

### 자바 6 업데이트
자바 6 출시 이후, 선과 나중에 오라클은 여러 업데이트를 출시했는데, 이는 공개 API를 변경하지 않으면서 최종 사용자 유용성을 향상시키거나 버그를 수정했다.

## Java SE 7

자바 7은 2011년 7월 7일에 출시된 주요 업데이트이며 2011년 7월 28일에 개발자에게 제공되었다. 개발 기간은 13개의 마일스톤으로 구성되었으며, 2011년 6월 6일에 13개의 마일스톤 중 마지막이 완료되었다. 평균적으로 마일스톤당 8개의 빌드 (일반적으로 개선 사항 및 버그 수정 포함)가 릴리스되었다. OpenJDK 7 프로젝트의 기능 목록에는 많은 변경 사항이 나열되어 있다.

자바 7의 추가 사항은 다음과 같다.
* 새로운 `invokedynamic` 바이트코드와 JSR-292에 따른 동적 프로그래밍 언어를 위한 JVM 지원, 현재 다국어 가상 머신에서 진행 중인 프로토타이핑 작업에 따른 것이다.
* 압축된 64비트 포인터 (Java 6에서 `-XX:+UseCompressedOops`와 함께 사용 가능)
* Project Coin 언어 기능:
:* switch의 문자열
:* try-statement의 자동 리소스 관리 (try-with-resources statement)
:* 제네릭 인스턴스 생성을 위한 개선된 자료형 추론, 다이아몬드 연산자 ``라고도 불린다.
:* 간소화된 varargs 메서드 선언
:* 이진 정수 리터럴
:* 숫자 리터럴에 밑줄 허용
:* 향상된 자료형 검사 기능으로 다중 예외 유형 포착 및 예외 다시 던지기
* JSR 166에 따른 동시성 유틸리티
* 여러 파일 시스템, 파일 메타데이터 및 심볼릭 링크 지원을 추가하는 새로운 파일 I/O 라이브러리 (JSR 203에 정의됨). 새로운 패키지는 `java.nio.file`, `java.nio.file.attribute` 및 `java.nio.file.spi`
* 컬렉션 및 객체 배열을 정렬하기 위해 합병 정렬 대신 팀소트 사용
* 타원 곡선 암호 알고리즘에 대한 라이브러리 수준 지원
* 최신 GPU의 특정 기능을 향상시키는 Java 2D용 XRender 파이프라인
* 버전 6u10에서 지원되지 않는 API로 처음 구현된 그래픽 기능에 대한 새로운 플랫폼 API
* SCTP 및 소켓 직접 프로토콜을 포함한 새로운 네트워크 프로토콜에 대한 향상된 라이브러리 수준 지원
* 업스트림 XML 및 유니코드 업데이트
* 자바 배포 규칙 세트

람다 (람다 함수의 자바 구현), 직소 (모듈의 자바 구현), 그리고 코인 일부는 자바 7에서 제외되어 자바 8의 일부로 릴리스되었다 (직소는 자바 9에서 릴리스되었다).

자바 7은 2012년 4월부터 자바 8이 출시될 때까지 java.com에서 다운로드되는 기본 버전이었다.

### 자바 7 업데이트
오라클은 2015년 4월에 제품의 공개 가용성이 종료될 때까지 분기별로 자바 7 제품군에 대한 공개 업데이트를 발행했다. 2022년 7월까지 계속된 JDK 7에 대한 추가 업데이트는 지원 계약이 있는 고객에게만 제공된다.

## Java SE 8 (LTS)

자바 8은 2014년 3월 18일에 출시되었으며, 원래 자바 7에서 계획되었지만 나중에 연기된 일부 기능을 포함했다.

기능 작업은 JDK 개선 제안 (JEP) 측면에서 구성되었다.
*JSR 335, JEP 126: 프로젝트 람다 및 기본 메서드 (가상 확장 메서드)에 따른 람다 표현식 (공식적으로 람다 표현식; 비공식적으로 클로저)에 대한 언어 수준 지원. 이는 기존 구현을 깨뜨리지 않고 인터페이스에 메서드를 추가하는 데 사용될 수 있다. 람다 표현식 지원 여부에 대한 자바 커뮤니티 내에서 지속적인 논쟁이 있었다. 선은 나중에 람다 표현식이 자바에 포함될 것이라고 선언하고 기능 개선을 위해 커뮤니티의 의견을 구했다. 람다 표현식 지원은 또한 함수형 스타일의 요소 스트림 작업을 가능하게 하며, 컬렉션에 대한 맵리듀스에서 영감을 받은 변환과 같은 기능을 포함한다. 기본 메서드는 API 작성자가 인터페이스에 새 메서드를 추가할 때 기존 코드를 깨뜨리지 않고 사용할 수 있다. 비록 주된 의도는 아니었지만, 기본 메서드는 동작의 다중 상속에도 사용될 수 있다 (상태는 아님).
*, 애플리케이션 내부에 포함된 자바스크립트 코드를 실행할 수 있는 자바스크립트 런타임
*
*부호 없는 정수 연산
*
*
*
* (자바FX 애플리케이션 JAR 직접 실행)
*

자바 8은 윈도우 XP에서 지원되지 않지만 JDK 8 업데이트 25부터는 윈도우 XP에서 설치 및 실행이 가능하다. 이전 버전의 JDK 8은 아카이브된 ZIP 형식 파일을 다운로드하여 실행 파일을 압축 해제하는 방식으로 XP에서 실행할 수 있었다. XP에서 실행할 수 있는 자바 8의 마지막 버전은 업데이트 251이다.

2014년 10월부터 자바 8은 공식 웹사이트에서 다운로드되는 기본 버전이 되었다 (그리고 자바 9를 대체하여 다시 다운로드). "오라클은 개인 사용자를 위해 자바 SE 8의 공개 업데이트 및 자동 업데이트를 무기한으로 계속 제공할 것이다."

### 자바 8 업데이트

## Java SE 9

자바 SE 9는 2017년 9월 21일에 출시되었다. 이는 자바 실행 위원회에서 프로젝트 직소의 현재 구현을 둘러싼 논쟁적인 수용 때문이었으며, 오라클은 몇 가지 미해결 문제와 우려 사항을 수정하고 몇 가지 중요한 기술적 질문을 개선해야 했다. 2017년 6월 말, 자바 커뮤니티 프로세스는 제안된 모듈 시스템 계획에 대해 거의 만장일치로 합의를 표명했다.
* JSR 376: 프로젝트 직소에 따른 JDK 모듈화 (자바 플랫폼 모듈 시스템)
* 자바DB가 JDK에서 제거되었다
* , 다양한 `java.util.concurrent.atomic` 및 `sun.misc.Unsafe` 작업에 해당하는 표준적인 호출 수단 정의
* , @SafeVarargs를 private 인스턴스 메서드에 허용; 실질적으로 final 변수를 try-with-resources 문의 리소스로 사용 허용; 추론된 자료형의 인자 자료형이 denotable인 경우 익명 클래스에 다이아몬드 연산자 허용; 자바 SE 8에서 시작된 밑줄을 합법적인 식별자 이름 집합에서 완전히 제거; 인터페이스의 private 메서드 지원
* : JShell은 자바 언어용 REPL 명령줄 인터페이스이다.
* 
* 
* , 리액티브 스트림의 자바 구현을 포함한다, 새로운 `Flow` 클래스를 포함한다 이는 이전에 리액티브 스트림에서 제공했던 인터페이스를 포함한다.
* 
* , 모듈 세트와 해당 종속성을 사용자 정의 런타임 이미지로 조립하고 최적화할 수 있는 도구 생성. 이는 실행할 JVM을 포함하여 완전히 사용 가능한 실행 파일을 생성할 수 있게 한다.
* , GraalVM이 제공하는 선행 컴파일

첫 번째 자바 9 릴리스 후보는 2017년 8월 9일에 출시되었다. 자바 9의 첫 번째 안정 버전은 2017년 9월 21일이었다.

### 역사
자바원 2011에서 오라클은 2016년에 자바 9에 출시할 것으로 기대되는 기능들을 논의했다. 자바 9에는 멀티 기가바이트 힙에 대한 더 나은 지원, 더 나은 네이티브 코드 통합, 다른 기본 쓰레기 수집기 (G1, "더 짧은 응답 시간"을 위해) 및 자체 튜닝 JVM이 포함될 것으로 예상되었다. 2016년 초, 자바 9의 릴리스는 2017년 3월로 재조정되었고, 나중에 다시 4개월 연기되어 2017년 7월로 미뤄졌다.

### 자바 9 업데이트

## Java SE 10

OpenJDK 10은 2018년 3월 20일에 출시되었으며, 12가지 새로운 기능이 확인되었다. 이 기능에는 다음이 포함된다.
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

이 중 첫 번째 JEP 286 지역 변수 자료형 추론은 `var` 키워드를 지역 변수에 사용할 수 있게 하며, 실제 자료형은 컴파일러가 계산한다. 이 변경으로 개발자는 변수의 자료형을 수동으로 지정하는 대신 다음을 수행할 수 있다.

```java
var list = new ArrayList<String>(); // ArrayList<String> 추론
var stream = list.stream();         // Stream<String> 추론
```


### 자바 10 업데이트

## Java SE 11 (LTS)

JDK 11은 2018년 9월 25일에 출시되었으며, 현재 버그 수정이 진행 중이다. 이 버전은 LTS, 즉 장기 지원을 제공한다. 다른 기능 외에도 자바 11에는 다음과 같은 여러 새로운 기능이 포함되어 있다.
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

이전 릴리스의 여러 기능이 삭제되었다. 특히, 자바 애플릿 및 자바 웹 스타트는 더 이상 사용할 수 없다. 자바FX, 자카르타 EE 및 CORBA 모듈은 JDK에서 제거되었다.

### 자바 11 업데이트

## Java SE 12

JDK 12는 2019년 3월 19일에 출시되었다. 다른 기능 외에도 자바 12에는 다음과 같은 여러 새로운 기능이 포함되어 있다.
* 
* 
* 
* 
* 
* 
* 
* 

프리뷰 기능 JEP 325는 `switch` 문을 확장하여 표현식으로도 사용할 수 있게 하며, 오른쪽에 표현식이 오는 새로운 형태의 case 레이블을 추가한다. break 문은 필요 없다. 복잡한 표현식의 경우 `yield` 문을 사용할 수 있다. 이는 자바 SE 14에서 표준이 된다.


```java
int ndays = switch(month) {
    case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
    case APR, JUN, SEP, NOV -> 30;
    case FEB -> {
        if (year % 400 == 0) yield 29;
        else if (year % 100 == 0) yield 28;
        else if (year % 4 == 0) yield 29;
        else yield 28; }
};
```


### 자바 12 업데이트

## Java SE 13

JDK 13은 2019년 9월 17일에 출시되었다. 자바 13에는 다음과 같은 새로운 기능과 "수백 가지의 작은 개선 사항 및 수천 가지의 버그 수정"이 포함되어 있다.
* 
* 
* 
* 
* 

JEP 355 텍스트 블록은 여러 줄 문자열 리터럴을 허용한다.


```java
String html = """
              <html lang="en">
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;
```


### 자바 13 업데이트

## Java SE 14

JDK 14는 2020년 3월 17일에 출시되었다. 자바 14에는 다음과 같은 새로운 기능과 "수백 가지의 작은 개선 사항 및 수천 가지의 버그 수정"이 포함되어 있다.
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

JEP 305, instanceof를 위한 패턴 매칭은 일반적인 `instanceof` 테스트에 이어 즉시 캐스팅되는 경우를 단순화하여 다음을 대체한다.


```java
if (obj instanceof String) {
    String s = (String)obj;
    System.out.println(s.length());
}
```


다음과 같이 변경된다.


```java
if (obj instanceof String s) {
    System.out.println(s.length());
}
```


JEP 359 레코드는 간단한 불변 튜플과 유사한 클래스를 쉽게 생성할 수 있게 한다.


```java
record Point(int x, int y) { }
Point p = new Point(3, 4);
System.out.println(p.x());
```


### 자바 14 업데이트

## Java SE 15

JDK 15는 2020년 9월 15일에 출시되었다. 자바 15는 예를 들어 여러 줄 문자열 리터럴 (텍스트 블록)을 지원한다. Shenandoah 및 Z 쓰레기 수집기 (후자는 때때로 ZGC로 약칭됨)는 이제 프로덕션에서 사용할 준비가 되었다 (즉, 더 이상 실험적이라고 표시되지 않음). 오라클의 솔라리스 운영 체제 (및 SPARC CPU) 지원은 중단되었다 (Java 11 등에서는 여전히 사용 가능). Nashorn 자바스크립트 엔진이 제거되었다. 또한 일부 루트 CA 인증서도 제거되었다.
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

JEP 360 봉인된 클래스는 다른 클래스나 인터페이스가 자신을 확장하거나 구현하는 것을 제한하는 봉인된 클래스 및 인터페이스를 추가한다. `permits` 절에 지정된 클래스만 해당 클래스나 인터페이스를 확장할 수 있다.

```java
package com.example.geometry;

public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}
```


레코드와 함께 봉인된 클래스는 합계 자료형이다. 이들은 레코드, 스위치 표현식, instanceof를 위한 패턴 매칭과 같은 다른 최신 기능들과 잘 작동한다. 이들은 모두 2018년 9월 개빈 비어만과 브라이언 고에츠가 처음 논의한 "자바의 패턴 매칭" 시스템의 일부를 형성한다.

### 자바 15 업데이트

## Java SE 16

JDK 16은 2021년 3월 16일에 출시되었다. 자바 16은 선행 컴파일 (및 Graal JIT) 옵션을 제거한다. 자바 구현 자체는 C++로 작성되었고 여전히 그렇지만, 자바 16부터는 더 최신 C++14 (그러나 아직 C++17 또는 C++20 등은 아님)가 허용된다. 코드도 깃허브로 옮겨졌으며, 머큐리얼은 소스 제어 시스템에서 제외되었다.
* 
* 
* 
* 
* 
* 
* &nbsp;— 아직 안정적이지 않음
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

### 자바 16 업데이트

## Java SE 17 (LTS)

JDK 17은 2021년 9월에 출시되었다. 자바 17은 새로운 6개월 릴리스 주기 (첫 번째는 자바 11)로 전환한 이후 두 번째 장기 지원 (LTS) 릴리스이다.
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 

JEP 406은 instanceof 작업에 사용되는 패턴 매칭 구문을 switch 문 및 표현식으로 확장한다. 이는 인수의 유형, null 케이스 및 정제 패턴에 따라 케이스를 선택할 수 있게 한다.


```java
Object o = ...;
return switch (o) {
        case null       -> "Null";
        case String s   -> "String %s".formatted(s);
        case Long l     -> "long %d".formatted(l);
        case Double d   -> "double %f".formatted(d);
        case Integer i && i > 0                            // refining patterns
                        -> "positive int %d".formatted(i);
        case Integer i && i == 0
                        -> "zero int %d".formatted(i);
        case Integer i && i < 0
                        -> "negative int %d".formatted(i);
        default         -> o.toString();
};
```


### 자바 17 업데이트

## Java SE 18

JDK 18은 2022년 3월 22일에 릴리스되었다.
* 
* 
* 
* 
* 
* 
* 
* 
* 

### 자바 18 업데이트

## Java SE 19

JDK 19는 2022년 9월 20일에 릴리스되었다.
* 
* 
* 
* 
* 
* 
* 

JEP 405는 레코드 패턴을 허용하여 instanceof 연산자와 Switch 표현식의 패턴 매칭 기능을 확장하여 레코드 구성 요소를 명시적으로 참조하는 레코드 패턴을 포함하도록 한다.

```java
record Rectangle(int x, int y, int w, int h) {}

int area(Object o) {
    if (o instanceof Rectangle(int x, int y, int w, int h)) {
        return w * h;
    }
    return 0;
}
```

이러한 패턴은 중첩된 패턴을 포함할 수 있으며, 레코드의 구성 요소 자체가 레코드이므로 패턴이 더 많은 객체 그래프와 일치할 수 있다.

### 자바 19 업데이트

## Java SE 20

자바 20은 2023년 3월 21일에 릴리스되었다. 모든 JEP는 인큐베이터 또는 미리보기였다.
* 
* 
* 
* 
* 
* 
* 

### 자바 20 업데이트

## Java SE 21 (LTS)

자바 21은 2023년 9월 19일에 릴리스되었다. 이 릴리스에서 윈도우 x86용 자바의 32비트 버전은 제거를 위해 폐기되었다. 미리보기 및 인큐베이팅 JEP만 있었던 자바 20에 비해, 인큐베이팅 및 미리보기 단계를 졸업한 8개의 JEP를 포함하여 다음 JEP가 추가되었다. 자바 21은 자바 17에서 처음 미리보기되었던 기능(Switch 문을 위한 패턴 매칭)과 자바 19에서 미리보기되었던 기능(레코드 패턴)을 도입한다. 자바 21에 추가된 모든 JEP는 다음과 같다.

# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 

JEP 445는 이름 없는 클래스를 미리보기하여 상용구 코드 없이 기본적인 Main 클래스를 허용한다.
```java
void main() {
    System.out.println("Hello, World!");
}
```


다음 대신:
```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
```


### 자바 21 업데이트

## Java SE 22

자바 22는 2024년 3월 19일에 릴리스되었다. 이 릴리스에 다음 기능 또는 JEP가 추가되었다.
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 

자바의 스레딩 구현과 관련된 API인 `java.lang.Thread.countStackFrames`는 제거되었다.

## Java SE 23

자바 23은 2024년 9월 17일에 릴리스되었으며, 다음 JEP가 포함되었다.
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 

문자열 템플릿 미리보기 기능은 디자인 문제로 인해 자바 23에서 제거되었다.

## Java SE 24

자바 24 사양은 2024년 12월에 확정되었으며, 24개의 JEP가 릴리스에 포함되었고 2025년 3월 18일에 릴리스되었다.

다음 JEP는 이 자바 SE 버전을 대상으로 했다.
# 
#  (이전에는 프로젝트 릴리풋으로 알려짐)
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 

자바 SE 24는 마이크로소프트 윈도우 10의 32비트 x86 에디션을 공식적으로 지원하는 마지막 자바 릴리스이다.

## Java SE 25 (LTS)

자바 25 사양은 2025년 7월에 확정되었으며, 18개의 JEP가 릴리스에 포함되었다. 자바 25는 2025년 9월 16일에 릴리스되었다.

# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 
# 

## 미래 기능
* 프로젝트 발할라: 객체 ID가 없지만 특정 경우에 향상된 메모리 레이아웃(간접 참조 감소)을 얻거나 할당이 완전히 최적화될 수 있는 값 클래스.
* 프로젝트 파나마:
** 네이티브 코드와의 상호 운용성 개선: 자바 소스 코드가 다른 언어의 함수를 호출하고 데이터 타입을 사용할 수 있도록 하며, 오늘날보다 더 쉽고 성능이 좋은 방식으로 (프로젝트 파나마의 이 부분은 자바 22에서 JEP 454: 외부 함수 & 메모리 API 아래 안정화되고 있다).
** Vector API, SIMD 프로그래밍을 위한 휴대용의 비교적 저수준 추상화 계층. 안정화는 프로젝트 발할라에 달려 있다.
* 프로젝트 릴리풋: 자바 객체 헤더 크기 줄이기. 먼저 64비트로, 그 다음 32비트로.
* JIT 모드에서 시작 시간 및 웜업 시간(최고 성능까지의 시간) 감소:
** 프로젝트 CRaC는 전체 JVM(실행 중인 애플리케이션과 함께)의 스냅샷을 만들고 필요한 조정(파일, 소켓 등 다시 열기)으로 복원할 수 있도록 한다.
** 프로젝트 레이든은 특히 부분 또는 (장기적으로) 전체 AOT 컴파일을 허용하여 전반적인 동적 동작을 줄여("closed-world constraints" 채택을 통해) 동적 컴파일 오버헤드를 줄인다.
* 프로젝트 바빌론은 코드 리플렉션(즉, 코드 자체에 대한 리플렉션)이라는 반영적 프로그래밍 능력 향상을 통해 자바 언어의 적용 범위를 대체 프로그래밍 모델로 확장하는 것을 목표로 한다. 명시된 주요 목표는 GPU에서 자바 코드를 실행하는 것이며, SQL 및 기타 프로그래밍 모델은 부차적인 목표이다.

## 구현
공식적으로 지원되는 자바 플랫폼은 썬에서 처음 개발되었고 현재 오라클이 관리하는 자바 SE이다. 릴리스는 OpenJDK 프로젝트를 기반으로 하며, 이는 자유 및 오픈 소스 프로젝트로 개방형 개발 모델을 따른다. 그러나 자바의 초기 사유 소프트웨어 역사로 인해 다른 자바 구현도 존재한다. 대조적으로, 일부 구현은 표준 구현보다 특정 이점을 제공하기 위해 만들어졌으며, 종종 학술 또는 기업 후원 연구의 결과였다. 많은 리눅스 배포판은 레드햇이 시작한 IcedTea 프로젝트를 통해 OpenJDK 빌드를 포함하며, 이는 더 간단한 빌드 및 통합 환경을 제공한다.

비주얼 J++와 마이크로소프트 자바 가상 머신은 호환되지 않는 구현으로 만들어졌다. 썬 대 마이크로소프트 소송 이후, 마이크로소프트는 이를 포기하고 .NET 플랫폼 작업을 시작했다. 2021년에 마이크로소프트는 자바 11부터 "Microsoft Build of OpenJDK"를 배포하기 시작했으며, 이후 자바 17에 대해서도 배포했다. 이들의 빌드는 윈도우뿐만 아니라 리눅스와 MacOS도 지원한다.

아줄의 Zing과 같은 다른 사유 자바 구현도 사용할 수 있다. 아줄은 Zulu라는 이름으로 인증된 오픈 소스 OpenJDK 빌드를 제공한다.

OpenJDK 릴리스 이전에 썬의 구현이 여전히 사유였을 때, GNU 클래스패스 프로젝트는 자바 플랫폼의 자유 및 오픈 소스 구현을 제공하기 위해 만들어졌다. OpenJDK가 공식 참조 구현이 된 JDK 7 릴리스 이후, GNU 클래스패스 프로젝트의 원래 동기는 거의 완전히 사라졌으며, 마지막 릴리스는 2012년이었다.

아파치 하모니 프로젝트는 OpenJDK 릴리스 직전에 시작되었다. 썬의 초기 소스 코드 릴리스 이후에도 하모니 프로젝트는 계속되었으며, OpenJDK에 선택된 보호적 라이선스와 대조적으로 완화된 라이선스 아래 구현을 제공하기 위해 노력했다. 구글은 나중에 안드로이드를 개발하고 완화된 라이선스 아래 릴리스했다. 안드로이드는 하모니 프로젝트의 일부를 통합하고 구글의 자체 달빅 가상 머신과 ART로 보완했다. 아파치 하모니는 이후 폐기되었으며, 구글은 하모니 구성 요소를 OpenJDK의 동등한 구성 요소로 대체했다.

Jikes와 Jikes RVM은 모두 IBM이 개발한 오픈 소스 연구 프로젝트이다.

사유 소프트웨어로 시작했지만 현재는 오픈 소스인 다른 구현도 여러 개 존재한다. IBM은 처음에 OpenJ9를 사유 J9로 개발했지만, 이후 프로젝트의 라이선스를 변경하고 이클립스 재단에 기증했다. JRockit은 오라클에 인수되어 이후 OpenJDK 버전에 통합된 사유 구현이다.

### 2025년 가장 일반적으로 사용되는 구현

아마존은 성능 향상 및 보안 수정 사항을 포함하는 장기 지원을 제공하는 비용 없는 다중 플랫폼 프로덕션 준비 OpenJDK 배포판인 Corretto를 개발했다. Corretto는 자바 SE 표준과 호환되는 것으로 인증되었으며, 아마존 내부에서 많은 프로덕션 서비스에 사용된다.

AdoptOpenJDK로 이전에 알려졌던 Eclipse Temurin 프로젝트는 완전히 오픈 소스 빌드 팜에서 사전 빌드된 OpenJDK 바이너리를 제공한다. 이 프로젝트는 2021년에 Adoptium 워킹 그룹의 일환으로 이클립스 재단으로 전환되었으며, 고품질의 벤더 중립적인 자바 런타임 배포를 보장한다.

BellSoft Liberica JDK는 임베디드 시스템 및 구형 아키텍처 지원을 포함하여 다양한 플랫폼용 빌드를 제공하는 또 다른 OpenJDK 기반 구현이다. JavaFX와 같은 추가 구성 요소를 포함하는 표준 버전과 "Full" 버전을 모두 제공한다.

SAP Machine은 SAP의 OpenJDK 다운스트림 배포판으로, SAP 애플리케이션 및 배포에 최적화되어 있다. OpenJDK의 릴리스 일정에 맞춰 단기 및 장기 지원 릴리스를 모두 제공한다.

알리바바 Dragonwell은 일부 자체 최적화가 포함된 OpenJDK의 다운스트림 버전이다. 시작 성능, 메모리 점유율 및 처리량 개선 사항을 포함한다.

GraalVM은 전통적인 자바 구현과는 상당히 다르다. 오라클 랩스에서 개발되었으며, 자바 외에도 자바스크립트, 파이썬, 루비, R과 같은 여러 언어를 지원하는 다중 언어 가상 머신을 제공한다. GraalVM은 자바로 작성된 고급 JIT 컴파일러를 포함하고 AOT 컴파일을 지원하여 네이티브 실행 파일을 생성하며, 시작 시간과 메모리 점유율을 크게 줄인다.

레드햇 빌드 OpenJDK는 레드햇 엔터프라이즈 리눅스 및 윈도우용 레드햇이 지원하는 OpenJDK 배포판으로, 레드햇의 구독 제품의 일부로 장기 지원 및 정기 업데이트를 제공한다.

Eclipse OpenJ9 JVM 및 OpenJDK 클래스 라이브러리를 기반으로 하는 Semeru Runtime은 IBM의 비용 없는 자바 런타임으로, 클라우드 배포에 최적화되어 있다. HotSpot 기반 구현과 비교하여 시작 시간 단축, 메모리 점유율 감소 및 처리량 개선을 제공한다.

## 각주

## 외부 링크
* Official Java SE Downloads
* Early history of Java 
* Sun Java Supported versions and EOL
* Downloads archive for older version of Java
* JDK Releases
* The Java Version Almanac

분류:소프트웨어의 역사
분류:자바 플랫폼
분류:소프트웨어 버전 역사