본문 바로가기
백엔드기술/개발언어

JDK 9 부터 17까지 총정리

by RevFactory 2023. 2. 15.

JDK 버전별 주요 Feature 요약  

Pixabay - by Rheo

Java 9

JPMS (Java Platform Module System)

모듈은 Package와 다른 데이터 자원을 포함합니다.

Jar 기반 모노리틱 방식을 개선하여 모듈 지정 및 모듈별 버젼관리가 가능해집니다.

임베디드 같은 시스템에 필요한 모듈만 구동하여 크기와 성능 최적화가 가능해집니다.

-  http://openjdk.java.net/projects/jigsaw/quick-start

 

try-with-resource 구문 개선

Java 7에서 추가된 try-with-resources 구문은 try( ) 블록에서 변수를 다시 선언해야 했는데 이 부분이 개선 되었습니다.

 

private interface 메서드 추가

Java8 의 interface에 추가된 default method 및 static method 의 단점을 보완하여 interface에 private method 선언이 가능해졌습니다.

 

Factory Method For Collections

List, Set, Map 을 위한 Factory Method 가 추가됩니다.

of( ) static method 로 편리하게 Collection을 생성할 수 있습니다.

null 요소로 만드려고 하면 NullPointerException 이 발생합니다.

static method 로 생성된 Collection 은 불변이므로 요소를 추가하려고 시도하면 UnsupportedOperationException 이 발생합니다.

 

Stream 개선

- 기존에 iterate( ) 사용시 무한 순차 스트림 반환시 문제를 개선하기 위해 2번째 파라미터로 조건식이 추가되었습니다.

- takeWhile( ), dropWhile( ) 이 추가되었습니다.

- stream 에 null이 될 수 있는 요소도 추가할 수 있도록 ofNullable( ) 가 추가되었습니다.

 

Optional 개선

- Stream 에서 Optional 요소들을 더 잘 다루기 위해 Optional 에 stream( ) 이 추가되었습니다.

- ifPresentOrElse( ) 가 추가되어 존재 하지 않는 경우도 깔끔한 코드를 작성할 수 있게 되었습니다.

- or( ) 가 추가되어 한개의 대체 객체 생성만 지원하던 orElseGet( ) 의 단점을 보완했습니다.

 

다이아몬드 연산자를 익명 클래스에도 사용 가능

Java 7 에 추가된 다이아몬드 ( < > ) 연산자는 익명 클래스에 선언될 수 없었으나 java 9 부터는 가능해졌습니다.

 

Tools 제공

- Java shell 인 Jshell 도구 제공합니다.

통일된 JVM 로깅 제공합니다.

- HTML 형식의 API 문서 생성 도구 제공합니다.

 

CompletableFuture API 개선

Java 8 의 CompletableFuture 에 delay 와 timeout 설정이 추가되었습니다.

 

HTTP2  클라이언트 (incubating)

HttpURLConnection 을 대체하기 위한 HTTP2 클라이언트가 인큐베이터 모듈로 추가되었습니다.

HTTP/1.1 및 HTTP/2 프로토콜을 지원합니다.

동기/비동기 모드를 지원합니다.

 

프로세스 API

새로 추가된 ProcessHandle 를 통해 프로세스 정보를 확인 가능해졌습니다.

 

로깅 API

java.util.logging 또는 Backend 구성없이 자체적으로 로깅 모듈을 연결하여 사용할 수 있게 됩니다.

 

Flow API for Reactive Stream

publish-subscribe 프레임워크를 지원하는 Flow API 가 추가되었습니다.

Publisher, Subscriber, Subscription, Processor 등 Functional Interface 가 추가되었습니다.

 

국제화 지원 향상

Java 8 에서 unicode 6.2 를 지원했었으나, Java 9 에서는 Unicode 8.0 표준을 지원합니다.

기본 로케일이 변경됩니다.

프로퍼티 리소스 번들을 로드 할때 IOS-8859-1 인코딩이 사용되었으나 UTF-8 로 변경되었습니다.

 

Deprecation 개선

@Deprecated 어노테이션에 forRemoval( ) 및 sinse( ) 가 추가되었습니다.

 

Stack-Walking API

Throwable 을 통해 이전 Stack 정보를 조회했었는데 새로 추가되는 StackFrame 을 이용하여 Stack 정보를 필터링 하여 조회가 가능해집니다,

 

 

Java 10

var - 로컬 변수타입 추론

컴파일러에서 로컬 변수 타입을 추론합니다

초기화 하면서 로컬 변수 선언할때와 반복문에서 지역변수 선언시 사용할 수 있습니다.

lambda, generic, diamond 에서 사용시 추론이 실패합니다. (java 11에서 lambada 지원 추가됩니다)

 

Immutable Collections

수정 불가능한 Collections 가 추가됩니다.

변경가능한 collection 을 얻기 위해 copyOf( ) 가 제공됩니다.

Stream에 toUnmodifiableList( ), toUnmodifiableMap( ), toUnmodifiableSet( ) 이 추가되었습니다.

 

Optional 개선

파라미터가 없는 orElseThrow( ) 가 추가되며, 값이 없는 경우 NoSuchElementException 이 발생합니다.

 

성능향상

병렬로 Full GC가 처리됩니다.

-XX:ParallelGCThreads 옵션으로 스레드의 수를 조정합니다.

full GC 발생시 모든 쓰레드가 동시에 멈추었는데 이제 개별 쓰레드별로 멈춥니다.

 

6개월 출시 주기

자바 버젼 표기 방식이 변경됩니다.

 

 

Java 11

(GA 2018.09.25)

람다에서 var 변수

Java 10 에 추가된 var 타입 추론을 람다에서도 가능하도록 개선했습니다.

 

HTTP Client

java.incubator.http 에서 java.net.http 로 표준화되었습니다.

Non-Blocking request, response 를 지원합니다.

HTTP/2 를 지원합니다.

HttpClient 는 Factory method 형태로 사용합니다.

HttpClient, HttpRequest, HttpResponse, WebSocket

 

Optional 개선

isEmpty( ) 가 추가됩니다.

 

새로운 String method

isBlank( ) 메서드가 추가됩니다.

repeat(int) 메서드가 추가됩니다.

strip( ), stripLeading( ), stripTrailing( ) 메서드가 추가됩니다.

stream 에 lines( ) 메서드가 추가됩니다.

 

새로운 File mthod

writeString( ), readString( ) 이 추가됩니다.

isSameFile( ) 이 추가됩니다.

 

새로운 I/O method

InputStream에 nullInputStream( ), OutputStream에 nullOutputStream( ) 가 추가됩니다.

Reader에 nullReader( ), Writer에 nullWriter( ) 가 추가됩니다.

 

Predicate not

Predicate 에 not 메서드가 추가됩니다.

 

단일 java 파일 실행

단일 실행파일로 제공되는 프로그램을 실행할 수 있게 됩니다.

 

성능개선

Epsilon GC 가 추가됩니다. (테스트 목적)

ZGC가 추가됩니다.

Low-Overhead Heap Profiling

 

Java 12

(GA 2019.03.19)

Switch expression 확장

패턴 매칭 가능, 추후 instanceof 를 적용하기 위한 preview 버젼
표현식으로 구현가능
preview 모드로 --enable-preview option 을 추가하여 사용 가능

 

Compact Number Format 지원

숫자 서식 지정에 대한 지원을 추가합니다. 간결한 숫자 형식은 짧거나 사람이 읽을 수있는 형식으로 숫자를 표현하는 것을 말합니다.
예를 들어 en_US 로케일에서에서 지정한 스타일에 따라 1000은 "1K"로 형식화되고 1000000은 "1M"로 형식화 될 수 있습니다

 

유니코드 11.0 지원

Unicode 11.0 참조

 

JVM 상수 API

상수 풀과 같은 주요 클래스 파일 및 런타임 아티팩트를 모델링하는 API를 도입
이 API에는 ClassDesc, MethodTypeDesc, MethodHandleDesc 및 DynamicConstantDesc와 같은 클래스가 포함됨

 

G1 개선

이 기능은 G1 (Garbage First) 가비지 수집기가 혼합 컬렉션 집합을 필수 및 선택적 부분으로 분할하여 가비지 수집 프로세스를보다 효율적으로 중단하도록 함

 

Java 13 

(GA 2019.09.17)

Switch expression 확장

java 13에서는 yield문을 포함하여 switch 표현을 확장
preview 모드로 --enable-preview option 을 추가하여 사용 가능

 

Text Block

임베디드 JSON, XML, HTML 등과 같은 여러 줄 문자열에 대한 텍스트 블록 사용 가능
preview 기능

// AS-IS
String JSON_STRING = 
  "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : 
  \"https://www.%s.com/\"\r\n" + "}";


// TO-BE
String TEXT_BLOCK_JSON = """
{
    "name" : "Baeldung",
    "website" : "https://www.%s.com/"
}
""";

 

ZGC : 미사용 메모리 커밋 해제

ZGC는 이제 지정된 최소 힙 크기에 도달 할 때까지 기본적으로 커밋되지 않은 메모리를 운영 체제에 반환
ZGC는 이제 지원되는 최대 힙 크기가 16TB (이전에는 4TB가 제한)

 

레거시 Socket API 재구현

API를 미래형 사용자 모드 Thread에 맞추기 위해 기본 구현 을 대체
PlainSocketImpl 대신 공급자 인터페이스는 이제 NioSocketImpl을 사용

 

FileSystems.newFileSystem() 메소드 추가

파일의 내용을 파일 시스템으로 취급하는 파일 시스템 공급자를보다 쉽게 사용할 수 있도록 FileSystems 클래스에 세 가지 새로운 메서드가 추가
- newFileSystem(Path)
- newFileSystem(Path, Map<String, ?>)
- newFileSystem(Path, Map<String, ?>, ClassLoader)

 

Java 14

(GA 2020.03.17)

instanceof 에 대한 패턴 매칭 (Preview)

패턴 매칭을 이용하여 개체의 Type을 정확하게 정의할 수 있으며, 문(statements) 과 식(expressions)에 대한 자체 입력에 대해 테스트 가능

 

Switch 표현식 

Java12, Java13 에서 Preview로 제공하던 Switch 개선을 정식으로 포함 

// Switch expressions
T result = switch (arg) {
    case L1 -> e1;
    case L2 -> e2;
    default -> e3;
};


// Yielding a value
int result = switch (s) {
    case "Foo": 
        yield 1;
    case "Bar":
        yield 2;
    default:
        System.out.println("Neither Foo nor Bar, hmmm...");
        yield 0;
};

 

JFR 이벤트 스트리밍

JFR (Java Flight Recorder) 에서 수집 한 데이터를 사용하여 활성 및 비활성 응용 프로그램을 지속적으로 모니터링  가능

 

NullPointerExceptions 개선

프로그램의 바이트 코드 명령을 분석하여 향후 JVM은 어떤 변수가 0 값을 초래하는지 정확하게 표시
NPE에 대해 덜 혼란스럽고 걱정할 수 있으며 프로그램에 대한 일반적인 이해가 향상 목적

 

 

Javapackager 도구 (인큐베이팅)

Java application 이 설치될 수 있는 방식으로 패키징 툴을 제공
모든 종속성을 포함하는 자바 응용프로그램 이미지 생성

 

G1에 대한 NUMA 인식 메모리 할당

Numa (Non-Uniform Memory Access / 불균형 기억 장치 접근)  
G1 Garbage Collector에 이러한 아키텍처를 유리하게 사용할 수있는 가능성을 제공

 

ZGC MacOS, Windows 제공

Java13 에 추가된  Linux에서 사용 가능하던 ZGC 를 macOS 와 Windows 환경에서도 옵션 제공

 

Text Block 두번째 Preview

String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing " +
                 "elit, sed do eiusmod tempor incididunt ut labore " +
                 "et dolore magna aliqua.";

String text = """
                Lorem ipsum dolor sit amet, consectetur adipiscing \
                elit, sed do eiusmod tempor incididunt ut labore \
                et dolore magna aliqua.\
                """;

String colors = """
    red  \s
    green\s
    blue \s
    """;

 

Java 15

(GA 2020.09.15)

Record Class (Preview)

변경할 수 없는 데이터 객체를 쉽게 만들 수 있는 클래스
final 로 선언되며, abstract로 선언될 수 없음

// AS-IS 
public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

// TO-BE
public record Person(String name, int age) {

}

 

Sealed Class (Preview)

개별 클래스가 하위 유형으로 사용할 수 있는 유형을 선언할 수 있도록 함

public abstract sealed class Person
    permits Employee, Manager {
    //...
}

public final class Employee extends Person {
}

public non-sealed class Manager extends Person {
}

 

Hidden Class

검색할 수 없는 클래스의 런타임 생성을 허용함
다른 클래스에서 사용할 수 없고 리플렉션을 통해 발견될 수도 없음

 

instanceof 패턴 일치 유형 검사

instanceof 와 함께 사용 되는 패턴의 상용구 코드 제거

// AS-IS
if (person instanceof Employee) {
    Employee employee = (Employee) person;
    Date hireDate = employee.getHireDate();
    //...
}

// TO-BE
if (person instanceof Employee employee) {
    Date hireDate = employee.getHireDate();
    //...
}

 

외부 메모리 API (Incubator)

Foreign-Memory Access API

 

GC - ZGC, Shenadoah 지원

ZGC (Z Garbage Collector), Shenandoah: Low-Pause-Time Garbage Collector

 

텍스트 블록

JDK13, JDK14 preview 였던 텍스트 블록 정식 지원 (java13 예제 참고)

 

 

Java 16

(GA 2021.03.16)

Proxy Instance 에서 기본 메소드 호출

Interface의 기본 메소드에 대한 개선사항으로 java.lang.reflect.InvocationHandler에 대한 지원 추가

Object proxy = Proxy.newProxyInstance(getSystemClassLoader(), new Class<?>[] { HelloWorld.class },
    (prox, method, args) -> {
        if (method.isDefault()) {
            return InvocationHandler.invokeDefault(prox, method, args);
        }
        // ...
    }
);
Method method = proxy.getClass().getMethod("hello");
assertThat(method.invoke(proxy)).isEqualTo("world");

 

Packaging Tool

JDK14에서 소개되었던 Jpackge Tool이 정식으로 제공

 

Pattern Matching for instanceof

instanceof 연자에 대해 pattern matching 을 적용

// example1
if (obj instanceof String s && s.length() > 5) {
    flag = s.contains("jdk"); 
}

// example2
// AS-IS
public boolean equals(Object o) { 
    return (o instanceof CaseInsensitiveString) && ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
}

// TO-BE
public boolean equals(Object o) {
    return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); 
}

 

Record Class 향상

// Constructors for record classes
record Rational(int num, int denom) { 
    Rational { 
        int gcd = gcd(num, denom); 
        num /= gcd; 
        denom /= gcd; 
    } 
}

 

Java 17

(GA 2021.09.14)

엄격한 부동 소수점 체계 복원

기본 부동 소수점 체계를 병행하지 않고 일관되게 부동 소수점 체계를 사용

 

향상된 난수 생성기 PRNG 제공

점프 가능한 (jumpable) PRNG, 분할 가능한 (splittable) PRNG algorithm(LXM)을 포함

 

JDK 내부 요소 강력 캡슐화

JDK 9~16에서 사용한 single command-line option으로 인한 옵션은 JDK에서 사용할 수 없음
reflection을 통한 private field 접근에 대해 더 이상 동작 안함

 

패턴매칭 Switch 구문 (Preview)

switch 구문에서 Pattern Matching 을 작성 가능

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i); 
        case Long l -> String.format("long %d", l); 
        case Double d -> String.format("double %f", d); 
        case String s -> String.format("String %s", s); 
        default -> o.toString(); 
    }; 
}

AOT 및 JIT compiler 제거

실험적인 Java 기반 AOT(Ahead-of-Time) 및 JIT(Just-In-Time) 제거
JVM compiler interface(JVMCI)는 유지

 

LTS release 2년 주기로 전환

JDK 17 release 이후부터는 2년 주기로 LTS release version을 관리
따라서 다음 LTS release version은 2023년 9월에 배포되는 JDK 21이 됨

 

 

(참고) Spring 과 JDK support

2022년 11월 예정인 Spring Framework 6에서는 JDK 17이 최소 지원일 것으로 예정

 

JDK12 ~ JDK17 Language Specification

새로 추가되는 기능은 보통 Preview -> Second Preview -> 정식 기능의 단계로 JDK에 반영되어 피드백을 받아 개선하는 절차를 거친다. 

language specification 관련 JEP 적용 JDK
Switch Expressions JEP 325: Switch Expressions (Preview) JDK 12
JEP 354: Switch Expressions (Second Preview) JDK 13
JEP 361: Switch Expressions JDK 14
Text Blocks JEP 355: Text Blocks (Preview) JDK 13
JEP 368: Text Blocks (Second Preview) JDK 14
JEP 378: Text Blocks JDK 15
Pattern Matching for instanceof JEP 305: Pattern Matching for instanceof (Preview) JDK 14
JEP 375: Pattern Matching for instanceof (Second Preview) JDK 15
JEP 394: Pattern Matching for instanceof JDK 16
Records JEP 359: Records (Preview) JDK 14
JEP 384: Records (Second Preview) JDK 15
JEP 395: Records JDK 16
Sealed Classes JEP 360: Sealed Classes (Preview) JDK 15
JEP 397: Sealed Classes (Second Preview) JDK 16
JEP 409: Sealed Classes JDK 17
Restore Always-Strict Floating-Point Semantics JEP 306: Restore Always-Strict Floating-Point Semantics JDK 17
Pattern Matching for switch JEP 406: Pattern Matching for switch (Preview) JDK 17

 

 

Reference