Java는 오랜 시간 동안 발전을 거듭해 왔습니다. 처음에는 단순한 객체지향 언어였지만, 점점 더 강력한 기능을 갖추면서 다양한 환경에서 활용될 수 있도록 변화해 왔습니다. 특히 LTS(Long-Term Support) 버전은 기업에서 안정적으로 사용할 수 있도록 지원됩니다. 이 글에서는 Java 6부터 주요 변화를 실제 개발 과정에서 마주할 수 있는 이야기로 풀어보겠습니다.
1. Java 6 ~ 주요 변화 한눈에 보기
버전출시 | 주요변화 | 추가된 이유 | 이후 발전 |
Java 6 (2006) |
JVM 성능 개선 웹 서비스 강화 |
실행 속도 향상 기업용 웹 서비스 지원 |
RESTful API 발전 Java EE → Jakarta EE 변경 |
Java 7 (2011) |
코드 가독성 향상 병렬 처리 지원 |
멀티코어 환경 증가 예외 처리 개선 |
Java 8의 Stream API와 결합하여 더 강력한 데이터 처리 가능 |
Java 8 (LTS) (2014) |
람다식 스트림 API 추가 |
코드 간결화 병렬 처리 최적화 |
이후 Optional, Collectors 추가로 데이터 처리 효율 증가 |
Java 9 (2019) |
모듈 시스템(JPMS) 도입 | 대규모 프로젝트 유지보수 용이 | jlink 활용해 JDK 크기 최적화 가능 |
Java 10 (2018) |
var 추가 (변수 타입 추론) | 코드 가독성 향상 불필요한 선언 제거 |
Java 11에서 var가 Lambda에서도 지원됨 |
Java 11 (LTS) (2018) |
JRE 제거 HTTP Client 정식 지원 |
JDK 크기 감소 네트워크 성능 향상 |
Java 17에서 TLS 1.3 기본 적용 |
Java 12 (2019) |
switch 문법 개선 | 가독성 향상 & 코드 간결화 | 이후 Pattern Matching for switch(Java 17) |
Java 13 (2019) |
Text Blocks(""") 추가 | 멀티라인 문자열 가독성 향상 | 이후 정식 기능(Java 15) |
Java 14 (2020) |
record 추가 | 불변 객체 패턴 간소화 | 이후 정식 기능(Java 16) |
Java 15 (2020) |
sealed class 도입 | 클래스 상속 제한 가능 | 이후 정식 기능(Java 17) |
Java 16 (2021) |
패턴 매칭 Vector API 추가 |
instanceof 코드 간결화 고성능 연산 지원 |
이후 Pattern Matching for switch(Java 17) |
Java 17 (LTS) (2021) |
GC 성능 최적화 보안 정책 변경 |
Security Manager 폐지 ZGC정식 지원 |
Java 21에서 Virtual Threads 추가 |
2. 주요 기능과 발전 스토리
📌 Java 6: 기본적인 JVM 최적화
Java 6에서는 성능 최적화를 위한 다양한 작업이 진행되었습니다. 이 시기에 Just-In-Time (JIT) 컴파일러가 더욱 개선되었고, 가비지 컬렉터(GC)도 일부 최적화되었습니다. 하지만 이때의 GC는 여전히 멀티코어 환경을 충분히 활용하지 못했습니다.
📌 Java 7: try-with-resources (자동 자원 관리) 및 G1 GC 등장
Java 6까지는 파일을 다룰 때 개발자가 직접 close()
를 호출해야 했습니다. 이 과정에서 실수로 자원을 해제하지 않는 문제가 발생하곤 했습니다. 이를 해결하기 위해 Java 7에서는 try-with-resources
문법을 도입하여 자동으로 자원을 닫아주도록 만들었습니다.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
} // br.close() 호출 필요 없음!
Java 7에서는 병렬 처리와 함께 G1(Garbage-First) GC가 실험적으로 도입되었습니다. 기존의 Parallel GC는 큰 객체를 처리할 때 멈춤 시간이 길어지는 문제가 있었는데, G1 GC는 힙을 여러 영역으로 나누어 필요한 부분만 청소할 수 있도록 설계되었습니다.
📌 Java 8: 람다식 & 스트림 API - 더 간결한 코드
Java 7까지는 반복문을 사용해 데이터를 처리해야 했습니다. 하지만 데이터가 많아질수록 코드가 복잡해졌죠. 이를 해결하기 위해 람다식과 스트림 API가 추가되었습니다. 이제 데이터 처리가 훨씬 직관적이 되었습니다.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().filter(name -> name.startsWith("A")).forEach(System.out::println);
Java 8에서 G1 GC가 기본 설정으로 변경되었습니다. 이로 인해 애플리케이션 실행 중 지연 시간이 줄어들고, 큰 객체를 다룰 때도 안정적인 성능을 제공할 수 있게 되었습니다.
📌 Java 9: 모듈 시스템(JPMS) 도입 및 G1 GC 개선 - 필요 없는 코드 제거
기존에는 프로젝트에서 사용하지 않는 라이브러리까지 모두 포함해야 했습니다. 이를 해결하기 위해 Java 9에서는 모듈 시스템(JPMS)을 도입하여 필요한 모듈만 로드할 수 있도록 했습니다.
module mymodule {
requires java.sql; // 필요한 모듈만 포함
}
Java 9에서는 G1 GC의 Full GC 성능이 개선되었습니다. 이전까지 G1 GC는 특정 상황에서 Full GC를 수행할 때 상당한 지연이 발생했지만, Java 9 이후로는 이를 최소화하는 방식으로 튜닝되었습니다.
📌 Java 10: var 키워드 - 더 간결한 변수 선언
변수 선언이 너무 장황해진다는 불만을 반영하여 Java 10에서는 var
키워드를 추가해 타입 추론을 자동으로 수행할 수 있게 되었습니다.
var message = "Hello, Java 10!";
System.out.println(message); // 타입 추론 자동 적용
📌 Java 11: HTTP Client 및 ZGC 실험적 추가
Java 8까지는 HttpURLConnection
을 사용해야 했는데, 코드가 너무 복잡했습니다. 이를 해결하기 위해 Java 11에서는 새로운 HTTP 클라이언트가 추가되었습니다. 그리고 비동기 네트쿼크 요청도 가능하게됩니다.
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Java 11에서는 ZGC(Z Garbage Collector)가 실험적으로 추가되었습니다. 이는 대규모 애플리케이션을 위해 설계된 초저지연 GC로, GC로 인한 멈춤 시간을 10ms 미만으로 줄일 수 있습니다.
📌 Java 14: record - 불변 객체 쉽게 만들기
DTO를 만들 때 getter
, setter
, equals()
등을 작성해야 했지만, Java 14부터는 record
키워드 하나로 간단하게 정의할 수 있습니다.
record Person(String name, int age) {}
Person p = new Person("Alice", 25);
System.out.println(p.name());
📌 Java 17: sealed class - 클래스 상속 제한
객체지향 프로그래밍에서 무분별한 상속을 방지하기 위해 Java 17에서는 sealed class
개념이 도입되었습니다.
sealed class Vehicle permits Car, Truck {}
final class Car extends Vehicle {}
final class Truck extends Vehicle {}
3. Java 버전 선택 가이드
✅ 최신 기능 활용 → 최신 버전 (Java 21)
✅ 안정적인 운영 → LTS 버전 (Java 11, Java 17)
✅ 레거시 유지 → 최소 Java 8 이상 유지
🔥 Java 8 사용자는 Java 17 업그레이드 추천
(더 좋은 GC, 네트워크 성능, 코드 가독성, 보안 강화)
'Java' 카테고리의 다른 글
REST API에서 요청 DTO를 매번 만들어야 하나? (0) | 2025.03.25 |
---|---|
REST API 설계, GET 방식과 보안이슈 (0) | 2025.03.25 |
자바의 특징 (0) | 2025.03.13 |
클래스 초기화 순서 (0) | 2025.03.13 |
OpenJDK vs Oracle JDK 차이점 (1) | 2025.03.10 |