Java 버전별 변천사 ( Java 6 ~ )

2025. 3. 15. 18:45·SW 공학 & 프로그래밍 언어/Java
728x90
반응형

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, 네트워크 성능, 코드 가독성, 보안 강화)

728x90
반응형
저작자표시 비영리 (새창열림)

'SW 공학 & 프로그래밍 언어 > 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
'SW 공학 & 프로그래밍 언어/Java' 카테고리의 다른 글
  • REST API에서 요청 DTO를 매번 만들어야 하나?
  • REST API 설계, GET 방식과 보안이슈
  • 자바의 특징
  • 클래스 초기화 순서
크크크크
크크크크
공뷰를 합시다.
    반응형
  • 크크크크
    Tom's Note
    크크크크
  • 전체
    오늘
    어제
    • 분류 전체보기 (124)
      • IT 지식 (4)
      • CS (65)
        • 알고리즘 & 자료구조 (19)
        • 운영체제 (40)
        • 네트워크 (1)
        • 데이터베이스 (5)
      • 보안 (3)
      • SW 공학 & 프로그래밍 언어 (46)
        • Java (28)
        • 디자인 패턴 (1)
        • 형상관리 (2)
        • 톰캣(WAS) (2)
        • SW 방법론 (3)
        • 스프링부트 (5)
      • 시스템 설계 (4)
        • Docker (2)
      • 자격증 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      ADsP
      분석기법
      docker
      whatis
      REST API
      비트연산
      whereis
      자바
      DI
      단반향
      문제해결
      스프링부트
      passwd
      암호설정
      which
      /etc/passwd
      2차
      cifs
      1급
      알고리즘
      usermod
      chmod
      apropos
      리눅스
      DTO
      Chage
      불변
      su
      java
      man
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    크크크크
    Java 버전별 변천사 ( Java 6 ~ )
    상단으로

    티스토리툴바