Java 버전을 왜 알아야 할까
사실 프로그래밍 언어는 버전이 높을 수록 낮은 버전의 기능들을 모두 지원할 확률이 높다.
특히 Java는 이러한 부분에서 높은 이식성을 갖는 것으로 유명하다.
하지만, 모든 프로젝트에서 높은 버전의 Java를 사용할 수는 없을 것이다.
기존에 개발하던 프로젝트의 Java 버전이 낮다면, 우리는 해당 버전에 대한 깊은 이해가 필요할 것이다.
따라서 이러한 점을 고려했을 때, Java의 버전별 특징에 대해서 알아야할 필요성을 느꼈다.
오래된 언어인 만큼, Java는 지금까지 많은 버전이 있기에 눈의 띄었던 것들만 빠르게 알아볼 예정이다.
JDK 1.0
Java의 첫 번째 버전인 JDK 1.0 버전이다.
해당 버전은 현재 Java에서도 사용되는 기초적인 기능들을 포함한다.
- awt, 기본 네트워크 기능, IO 등의 기능들
J2SE 1.2
자바 버전 2라고 볼 수 있다.
- Collections 도입
- Collections는 List, Queue와 같이 객체를 다루기 위한 클래스이다.
- Java 플러그인 도입
- JVM에 JIT 컴파일러를 탑재하여 성능 향상
J2SE 1.4
- assert 키워드 도입
- regex (정규식 모델) 도입
- NIO (논블로킹 IO) 도입
- 로깅 api 도입
- JPEG, PNG 형식을 위한 이미지 IO api
- xml 파서 (JAXP) 도입
Java SE 5 ( JDK 1.5 )
- 제너릭 도입
- 타입을 파라미터로 사용 가능해졌다
- 하나의 클래스로 여러 타입의 데이터를 다룰 수 있게 된다
public class DataHolder<T>{
T data;
public DataHolder(T data){
this.data = data;
}
}
DataHolder<String> a = new DataHolder<String>("Hello World");
DataHolder<Integer> b = new DataHolder<Integer>(1);
- 어노테이션 도입
- 메타데이터나 추가 정보를 태그처럼 이식 가능하다
- 컴파일이나 실행 과정에서 코드 처리 방식을 명명 가능하다
@Controller
public class UserController{
// do something
}
- auto boxing / unboxing 도입
- auto boxing : 원시 타입 데이터를 wrapper class로 자동 변환
- auto unboxing : wrapper class를 원시 타입 데이터로 자동 변환
// auto boxing
int ab = 1;
Integer wab = a;
// auto unboxing
Integer waub = 1;
int aub = waub;
- varargs 도입
- 매개변수의 개수에 상관없이 여러개의 매개변수를 받을 수 있는 기능
public int sum(int ...args){
int a = 0;
for(int x : args){
a+=x;
}
return a;
}
- 향상된 for문
- for문을 iterable한 collections에도 사용할 수 있게 되었다.
- java.util.concurrent 도입
- ExecutorService와 같은 클래스를 통해 다중 스레드 관리가 필요한 프로그램의 실행 시멘틱이 향상됨
- static import 도입
- 정적 클래스 등의 import가 추가됨
Java SE 6
- Java 자체적으로 JS와 같은 스크립팅 언어를 지원
- JDBC 4.0 지원
- JAXB를 2.0으로 업그레이드
- JVM 향상
- 컴파일러와 가비지 컬렉터 성능 향상
Java SE 7
- switch에서 문자열을 사용할 수 있게됨
- try-with-resources문의 자동 리소스 관리가 가능하게 되었음
try (...){
// do something
}
- diamond operator ( <> )를 통한 향상된 유형 추론이 가능해짐
List<String> listStr = new List<>();
Java SE 8
Java 7을 위해서 계획되었지만 일부 연기된 기능들을 포함한다.
- LocalDateTime과 같은 날짜 시간 api가 도입됨
- unsigned 연산을 위한 메서드가 추가됨
- 람다 표현식이 추가됨
- 이를 통해 메서드 참조 등의 기능을 사용할 수 있게 되었음
User user = userRepository
.findById(userId)
.orElseThrow(() -> new RuntimeException("user not exists"));
- Optional이 도입됨
Optional<String> a = getNameOrNull()
.orElse("default String");
- Stream api가 도입됨
List<UserResponse> users = userRepository.findAll()
.stream()
.map(user -> UserDto.fromEntity(user))
.toList();
Java SE 11
- 동적 클래스 파일 상수 (constantDynamic) 도입
- 런타임에 상수를 계산할 수 있도록 해주는 기능
- 무작동 가비지 컬렉터 도입 (Epsilon GC)
- 객체를 수집하지 않고, 메모리가 부족하면 프로세스를 종료함
- 메모리 사용량 테스트, GC 오버헤드 측정 등에 사용
- lambda 매개변수에 대한 로컬 변수 구문 추가
- 람다 파라미터에 var를 사용할 수 있게됨
- 낮은 오버헤드의 힙 프로파일링 기능 도입
- 힘 사용량, GC 동작, 객체 할당 정보 등을 애플리케이션 성능에 영향 없이 수집
Java SE 17
- 부동 소수점의 의미 체계 복원
- 하드웨어 기본 연산 방식을 따르도록 복원
- JDK 내부를 보다 강하게 캡슐화
- 봉인 클래스(Sealed Class) 도입
- 클래스를 상속/구현하는 하위 클래스를 명시적으로 제한할 수 있음
- 벡터 API의 실험적 도입
- 고성능 수치 연산 등에서 사용 가능
'CS 및 기본 개념' 카테고리의 다른 글
| [cs] HTTP 버전별 특징과 차이점 (4) | 2025.07.31 |
|---|---|
| [ NGINX ] NGINX를 리버스 프록시로 사용하는 WebSocket 시스템 구축 (6) | 2025.07.30 |
| [ AWS ] CDN (CloudFront) 으로 S3 정적 파일 관리하기 (3) | 2025.07.23 |
| [ CS ] 네트워크 주요 포트번호와 그 사용처 (3) | 2025.07.22 |
| [ Java ] Executor 인터페이스로 동시성 관리하기 (1) | 2025.07.09 |