출처 : Java Versions and Features
1. JRE와 JDK
- JRE : Java Runtime Environment
- JDK : Java Development Kit
옛날에는 Java 프로그램을 실행하고 싶으면, JRE만 다운받았습니다. JRE 안에는 JVM이 포함되어 있었고, 바로 이 JVM이 Java 프로그램을 운영체제에서 실행시킬 수 있도록 해주었던 것이죠.
Java로 개발을 하기 위해서는 JDK를 다운받아야 했습니다. JDK 안에는 JRE가 갖는 모든 것들이 포함되어 있었고, 여기에 java compiler, javadoc, java debugger 등이 포함되어 있었습니다. 이 때 JRE는 JDK와 완전히 별개의 폴더에 구분되어 있었습니다.
하지만 이제는 조금 다릅니다.
Java 8까지는 위와 같이 JRE, JDK를 나누어 다운받을 수 있도록 Oracle 웹사이트가 지원했습니다. 하지만 Java 9부터는 JDK 다운로드로 통합되었고, JRE도 더이상 별개의 폴더에 구분되어있지 않게 되었습니다.
따라서, 현재는 Java와 JDK가 거의 같은 말이 되었습니다
2. Java Distribution
1_ The OpenJDK project
- Java source code (JRE, JDK의 소스코드)입니다.
- 빌드되지 않은 날 것 그대로의 코드입니다.
- 우리는 이 코드를 가져다가 마음대로 빌드해서 사용할 수 있지만, 그 동작의 신뢰성은 보장할 수가 없습니다. 때문에 오라클과 같은 기업들이 Java version들을 관리하면서 배포하고, 우리는 기업들이 배포한 빌드를 믿고 가져다가 쓰는 것입니다.
2_ OpenJDK builds
- from Oracle
- 무료!
- 상위 버전이 공개되면 하위 버전에 대한 유지보수를 제공하지 않음
3_ OracleJDK builds
- also from Oracle
- commercial use의 경우, license가 있습니다. 즉, 무료가 아닙니다!
- 상위 버전이 릴리즈 되어도 Oracle로부터 현재 사용하고 있는 버전에 대한 지원을 받을 수 있습니다
이외에도 Adoptium, Azul Zulu, Amazon Corretto, SAPMachine 등등 다양한 JDK들이 존재합니다.
3. Java Versions
Java 8
Java 9
- Collections.of()가 추가되었습니다.
- Optional이 자바에 등장했습니다.
- Interface가 private method를 가질 수 있게 되었습니다.
- JShell이 추가되었습니다.
- HTTPClient가 Java의 built-in HTTP support로 등장했습니다.
Java 10
- local variable type inference, var를 사용할 수 있게 되었습니다.
Java 11
- String 클래스에 메서드가 몇가지 추가되었습니다 (isBlank, lines, strip)
Java 12
Java 13
- switch문에 람다식을 사용할 수 있게 되었습니다.
- Multiline String이 가능하게 되었습니다.
Java 14
- switch문의 람다식 사용이 표준화 되었습니다(standardized)
- Records가 도입되었습니다.
- NullPointExceptions가 정확히 어느 변수에서 터진건지 드디어 알 수 있게 되었습니다.
- Pattern Matching for instanceOf가 도입되었습니다. (타입 캐스팅의 번거로움 감소)
- GC에 변경사항이 생겼습니다.
Java 15
- Java 13에서 도입되었던 Text-Blocks / Multiline Strings가 production - ready해졌습니다.
- Sealed classes가 도입되었습니다.
Java 16
- 이전 버전에서 도입되었던 Records, Pattern
Matching이 production - ready해졌습니다.
Java 17
- Java 11 이후로 등장한 새로운 LTS(Long-Term-Support) 버전 릴리즈입니다.
- switch문에서 패턴 매칭이 도입되었습니다.
- Sealed classes가 finalized 되었습니다.