자바를 사용하며 왜 이 버전을 사용하는지에 대한 고민없이 그냥 쓰고 있으니까..라는 생각으로 개발을 해왔다. 이제는 자바 몇 버전을 사용하고 왜 해당 버전을 사용하는지 명확하게 알기 위해 자바의 버전 별 특징을 알아보려 한다.
자바의 버전을 얘기할 때 jdk 1.X, Java X 이런식으로 많이들 얘기하는데 둘의 차이는 뭘까?
먼저 jdk는 java development kit의 약자로, 자바를 개발할 수 있는 환경을 제공하는 도구들의 모음이다. jdk를 설치하면 jvm과 java API 등 자바로 개발하는데 필요한 프로그램들이 설치된다.
보통 버전을 얘기할 때 jdk 1.x, java 1.x 버전이라고 하는 걸 많이 봤을 텐데, 자바 버전이 있고 이 규격에 따라 구현한 것을 jdk라고 보면 된다.
jdk 1.2, java 1.2와 같이 초기에는 java 버전을 1.x 형식으로 명명했지만, Java 9 버전 이후 1.x 표기법 대신 바로 숫자로 표기한다.
✅ 그래서 정리하자면 다음과 같다.
JDK 1.6 = Java 6
JDK 1.8 = Java 8
JDK 9 = Java 9 ← 이때부터는 1.x 없이 버전이 바로 숫자로 표기됨
자바는 3년 정도의 텀으로 LTS(Long Term Support)를 제공한다. 보통 8년 이상의 장기 지원을 제공한다. 현재 LTS 지원 Java 버전은 Java8, Java11, Java17, Java21이다.
Java6
JVM 성능 개선
→ 컴파일러와 GC(가비지 컬렉터) 최적화를 통해 실행 속도와 메모리 관리 효율이 개선됨
클래스 로딩 속도 향상
→ 많은 클래스가 필요한 대형 애플리케이션에서 성능이 개선됨
Java8
Lambda?
익명 함수(이름 없는 함수)를 작성하는 문법으로 코드의 간결성과 가독성을 높임
ex)
(int x, int y) -> {return x + y;}
Stream?
컬렉션(List, Set 등)에 저장된 데이터를 *선언형 방식으로 데이터를 필터링, 매핑할 수 있도록 해주는 기능
ex) stream을 통해 이름 리스트 중 "김"으로 시작하는 이름만 대문자로 출력
List<String> names = Arrays.asList("김민지", "이철수", "김철수", "박영희");
names.stream() // Stream 생성
.filter(name -> name.startsWith("김")) // "김"으로 시작하는 항목 필터
.map(String::toUpperCase) // 대문자로 변환
.forEach(System.out::println); // 출력
선언형 방식과 명령형 방식?
선언형 방식
명령형 방식
Java11
Java17
기존 switch문에서는 특정 타입에 대해서만 적용이 가능했지만, 모든 객체에 패턴을 적용할 수 있고, 패턴 매칭으로 instanceof를 사용하지 않고 자동으로 캐스팅을 할 수 있도록 개선되었다.
기존 switch문
static String format(Object obj) {
if (obj == null) {
return "null 값입니다.";
} else if (obj instanceof Integer) {
Integer i = (Integer) obj;
return "정수: " + i;
} else if (obj instanceof String) {
String s = (String) obj;
return "문자열: " + s.toUpperCase();
} else {
return "알 수 없는 타입";
}
}
개선된 switch문
static String format(Object obj) {
return switch (obj) {
case Integer i -> "정수: " + i;
case String s -> "문자열: " + s.toUpperCase();
case null -> "null 값입니다.";
default -> "알 수 없는 타입";
};
}
Java21
가상 스레드?
JVM 내부에서 경량으로 실행되는 스레드로 기존의 운영체제 스레드와는 독립적이며, 수천~수만 개의 스레드도 가볍게 실행할 수 있다.
기존 Java의 스레드는 운영체제의 스레드를 그대로 사용했는데, 굉장히 무겁고 생성과 제거하는데 비용이 많이 들었다. 이러한 문제를 해결하기 위해 OS 자원에 의존하지 않고, JVM 내부에서 관리하는 가상 스레드를 도입했다.
기존 방식(플랫폼 스레드)
Thread thread = new Thread(() -> {
System.out.println("작업 실행 중: " + Thread.currentThread());
});
thread.start();
가상 스레드 방식(Java 21)
Thread thread = Thread.startVirtualThread(() -> {
System.out.println("가상 스레드 실행 중: " + Thread.currentThread());
});
현재 전자정부프레임워크 2.0 버전을 사용하고 있는데, 2.0 버전의 경우 사용 가능한 자바 버전이 1.6이기 때문에 해당 버전을 사용하는게 아닐까 생각한다.
다음 포스팅에서 전자정부프레임워크에 대해서도 다뤄볼까 한다.
오늘은 여기까지!
[참고]
https://velog.io/@gourd_erased/%EC%9E%90%EB%B0%94-JDK%EA%B0%80-%EB%AD%90%EC%95%BC
https://tyan-8.tistory.com/30
https://velog.io/@itonse/Java-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4%EC%99%80-%ED%8A%B9%EC%A7%95-8-11-17-21