Java 버전별 차이

Programmingzi·2025년 7월 17일

자바를 사용하며 왜 이 버전을 사용하는지에 대한 고민없이 그냥 쓰고 있으니까..라는 생각으로 개발을 해왔다. 이제는 자바 몇 버전을 사용하고 왜 해당 버전을 사용하는지 명확하게 알기 위해 자바의 버전 별 특징을 알아보려 한다.

JDK/Java 버전

자바의 버전을 얘기할 때 jdk 1.X, Java X 이런식으로 많이들 얘기하는데 둘의 차이는 뭘까?

먼저 jdk는 java development kit의 약자로, 자바를 개발할 수 있는 환경을 제공하는 도구들의 모음이다. jdk를 설치하면 jvm과 java API 등 자바로 개발하는데 필요한 프로그램들이 설치된다.

보통 버전을 얘기할 때 jdk 1.x, java 1.x 버전이라고 하는 걸 많이 봤을 텐데, 자바 버전이 있고 이 규격에 따라 구현한 것을 jdk라고 보면 된다.

Java 버전 네이밍 방식

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 없이 버전이 바로 숫자로 표기됨

Java LTS 버전

자바는 3년 정도의 텀으로 LTS(Long Term Support)를 제공한다. 보통 8년 이상의 장기 지원을 제공한다. 현재 LTS 지원 Java 버전은 Java8, Java11, Java17, Java21이다.

LTS 버전을 사용해야 하는 이유?

  1. 장기적으로 보안 업데이트와 버그 수정을 지원해주기 때문
  2. 광범위하게 테스트되고 안정화된 후 릴리즈되기 때문에 높은 신뢰성을 가지고 있음
  3. 주요 라이브러리와 프레임워크가 LTS 버전을 우선적으로 지원하기 때문에 호환성이 높음

Java 버전 별 특징

Java6

  • JVM 성능 개선
    → 컴파일러와 GC(가비지 컬렉터) 최적화를 통해 실행 속도와 메모리 관리 효율이 개선됨

  • 클래스 로딩 속도 향상
    → 많은 클래스가 필요한 대형 애플리케이션에서 성능이 개선됨

Java8

  • 2014년 출시, LTS 버전
  • Oracle이 Java를 인수한 이후 첫번째 LTS 출시 버전
  • *Lambda, *Stream API, Optional, 날짜와 시간(LocalDateTime) API 제공

Lambda?
익명 함수(이름 없는 함수)를 작성하는 문법으로 코드의 간결성과 가독성을 높임

ex)

(int x, int y) -> {return x + y;}
  • 장점
    • 불필요한 반복문의 삭제를 통해 복잡한 식을 단순하게 표현 가능
    • Stream API와 결합 시 직관적인 처리 로직
  • 단점
    • 불필요하게 사용시 오히려 가독성이 떨어질 수 있음
    • 재사용이 어려움

Stream?
컬렉션(List, Set 등)에 저장된 데이터를 *선언형 방식으로 데이터를 필터링, 매핑할 수 있도록 해주는 기능

ex) stream을 통해 이름 리스트 중 "김"으로 시작하는 이름만 대문자로 출력

List<String> names = Arrays.asList("김민지", "이철수", "김철수", "박영희");

names.stream()                      // Stream 생성
     .filter(name -> name.startsWith("김")) // "김"으로 시작하는 항목 필터
     .map(String::toUpperCase)      // 대문자로 변환
     .forEach(System.out::println); // 출력

선언형 방식과 명령형 방식?

선언형 방식

  • 무엇을 할지를 표현하는 방식 ex) "김"을 필터링 해줘
  • stream API, SQL
  • 간결, 함수형 스타일
  • 가독성이 좋고 병렬 처리에 유리

명령형 방식

  • 어떻게 할지를 표현하는 방식 ex) 이 조건을 확인하고 반복해줘
  • for/while 반복문
  • 단계적, 절차적
  • 세밀한 제어 가능

Java11

  • 2018년 출시, LTS 버전
  • String과 File 기능 향상
    → String 클래스에 유용한 메서드 추가: isBlank(), strip()
    → 파일을 더 쉽게 읽고 쓸 수 있도록 메서드 추가: writeString(), readString()
  • HttpClient API 정식 도입
    기존에 불편했던 HTTP 통신 방식을 대체하고 HTTP/2 및 비동기 요청까지 포함하는 강력한 네트워크 클라이언트 기능 도입

Java17

  • 2021년 출시, LTS 버전
  • Spring Boot 3.x 버전은 jdk 17이상부터 지원
  • Switch에 대한 패턴 매칭(preview), 텍스트 블록 기능("""사용) 추가

기존 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

  • 2023년 출시, LTS 버전
  • Spring Boot 3.2부터 지원
  • 가상 스레드: Java 플랫폼에 경량 가상 스레드 도입

가상 스레드?
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());
});

왜 1.6 버전을 사용할까?

현재 전자정부프레임워크 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

0개의 댓글