현재 Java 버전은 6개월마다 릴리스 되고 있다.(저번달에 22 버전이 릴리스 되었다.)
로드맵을 보면 LTS, non-LTS가 각각 붙어있다. LTS는 Long Term Support로, 오랜 기간 지원하는 특별한 버전의 에디션을 뜻한다. (대부분 LTS 버전을 사용한다.)
Java 8 버전을 사용하여 프로젝트를 진행한 회사들이 많이 있고, 최신 IDE나 프레임워크를 사용하는 곳에서는 11, 17 버전을 사용하는 경우가 있다. (Java와 빠질 수 없는 짝꿍인 SpringBoot는 3.0 버전부터 Java 17 이상만 지원한다고 한다.)
Java의 하위 호환성
Java는 하위 호환성이 매우 높게 때문에 8, 11, 17 버전 등과 같이 특정 버전만을 학습하지 않아도 된다.
Java 5, 8 버전의 프로그램이 Java 8-17 가상 머신에서 실행되도록 보장된다.
하지만 반대로 Java 8 JVM에서는 사용할 수 없는 Java 17 기능을 의존한다면 컴파일되지 않는다.
(java.lang.UnsupportedClassVersionError 발생)
그러므로 Java 8의 내용들로 토대를 쌓고 Java 9-17에 추가된 기능에 대해 알아보고 언제든지 사용할 수 있다.
그럼 LTS버전인 8,11,17,21 버전에 대해 각각 알아보자
Java 8 - 21
Java 8
Java 8은 오라클이 Java를 인수한 후 첫 번째 LTS 출시 버전으로, 대규모 릴리스였다.
32비트를 지원하는 공식적인 마지막 버전이고, 유료버전(Oracle JDK)과 무료버전(Open JDK)으로 나뉜다.
- LocalDateTime과 같은 새로운 날짜, 시간 API 제공
- Lambda, Stream API 제공
- Optional 객체 등장
- 인터페이스에 default method 사용가능
Oracle JDK(유료) & Open JDK(무료)
· Oracle JDK는 LTS(장기 지원) 업데이트 지원을 받을 수 있지만, Open JDK는 LTS 없이 6개월마다 새로운 버전이 배포된다.
· Oracle JDK는 Oracle이 인수한 Sun Microsystems 플러그인을 제공한다.
· Oracld JDK는 Open JDK 보다 CPU 사용량과 메모리 사용량이 적고, 응답시간이 높다.
Java 8 이전의 두 버전 차이는 실제 소스 차이가 존재했는데, 최신의 두 버전은 본질적으로 동일하며 약간의 차이만 존재한다.
Java 11
개발자의 관점에서는 작은 릴리스이다. Oracle JDK와 Open JDK가 통합되고 Oracle JDK가 구독형 유료 모델로 전환되었다. 그리서 서드파티 JDK로의 이전이 필요해졌다.
- 모듈시스템 등장 (Java 9 릴리스)
- 인터페이스에 private method 사용 가능 (Java 9)
- 컬레션에 .of() 등 추가 기능 제공 (Java 9)
- var 키워드 도입 (Java 10)
- lambda 지역변수 사용법 변경
- 람다 표현식에 var 사용 가능
- G1 GC를 기본 GC로 채택
Java 17
Java 11이 2018-09-25에 릴리스 되고 3년 뒤인 2021-09-14에 릴리스 된 LTS 버전의 Java이다.
애플 M1 및 이후 프로세서 탑재 제품군에 대해서도 정식으로 지원하기 시작했다.
- 유니코드 11 지원 (Java 12)
- 스위치 표현식 표준화 (Java 14)
- record 선언 기능 추가 (Java 14)
- NullPointerExceptions는 어떤 변수가 null 인지 설명 (Java 14)
- 스케일링 가능한 낮은 지연의 GC 추가-ZGC (Java 15)
- 난수 생성 API 추가
- STream.toList() 사용가능
- NumberFormat, DateTimeFormatter 기능 향상
Java 21
지난 9월 19일 (2023년), Open JDK LTS인 JDK 21이 프로덕션에 적용 목적의 GA(General Availability)로 릴리스 되었다.
- Sequenced Collections 인터페이스 새로 정의
- Virtual Threads가 정식 적용
- 메모리를 ZPage라는 논리적인 단위로 구분하는 ZGC를 기본 GC로 채택
- Unnamed Patterns and Variables - Python3과 같이 이름 없는 패턴 및 변수를 밑줄 문자`_`로 표시 가능
참고
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
개발자 성장 기록 43 - Thread Pool (1) | 2024.04.07 |
---|---|
개발자 성장 기록 42 - Java 직렬화 (Serialization) (0) | 2024.04.06 |
개발자 취준 기록 35 - 추상클래스와 인터페이스의 차이 (0) | 2024.03.30 |
개발자 취준 기록 34 - Hash(Table·Map·Set) (0) | 2024.03.28 |
개발자 취준 기록 33 - Java 제네릭 (Generic) (0) | 2024.03.27 |