Java14 Releases notes

2020-09-07

Index

JEP 305: Pattern Matching for instanceof (Preview)

런타임 객체의 타입을 기존에는 instanceof 가 좀더 간결하고 안전하게 사용 할 수 있다.
아직 Preview이기 때문에 --enable-preview 옵션을 줘야 사용할 수 있는 기능이다.

기존엔 아래 와 같이 사용을 했다면 (캐스팅을 해야 한다.)

1
2
3
4
if (obj instanceof String) {
String s = (String) obj;
// use s
}

다음과 같이 사용 할 수 있다.

1
2
3
4
5
if (obj instanceof String s) {
// can use s here
} else {
// can't use s here
}

향후 JEP는 switch표현식 및 명령문과 같은 다른 언어 구조에 대한 패턴 일치를 통해 Java 프로그래밍 언어를 향상시킬 계획이다.

JEP 345: NUMA-Aware Memory Allocation for G1

NUMA(Non-Uniform Memory Access) 인식 메모리 할당을 구현하여 대형 컴퓨터에서 G1성능이 향상되었다.

JEP 358: Helpful NullPointerExceptions

NullPointerException정확히 어떤 변수인지 설명하여 사용성을 향상되었다.
예를 들어 아래와 같은코드에서 NPE가 발생하게 된다면

1
a.i = 99;

아래와 같은 에러 메세지를 볼 수 있다. 아래 에러 메시지로도 충분히 a가 null이라는 것 을 유추 할 수 있다.

1
2
Exception in thread "main" java.lang.NullPointerException
at Prog.main(Prog.java:5)

하지만 아래와 같은 코드에서는 기존 노출되는 에러메시지 만으로는 어떤 객체에서 NPE가 발생 한지 찾기 어렵다

1
2
a.b.c.i = 99;
a[i][j][k] = 99;

Java14에서 추가된 Helpful NullPointerExceptions 을 사용한다면 좀더 세분화된 에러 메세지를 볼 수 있다. 단 사용하기 위해선 실행 옵션에 -XX:+ShowCodeDetailsInExceptionMessages 를 넣어줘야 한다.

1
2
3
Exception in thread "main" java.lang.NullPointerException: 
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
1
2
3
Exception in thread "main" java.lang.NullPointerException: 
Cannot read field "c" because "a.b" is null
at Prog.main(Prog.java:5)
1
2
3
Exception in thread "main" java.lang.NullPointerException:
Cannot load from object array because "a[i][j]" is null
at Prog.main(Prog.java:5)
1
2
3
Exception in thread "main" java.lang.NullPointerException:
Cannot read field "j" because "b" is null
at Prog.main(Prog.java:5)

JEP 359: Records (Preview)

Java Class를 생성하게 되면 생성자, getter, setter등을 구현해야 하고 equals(), hashcode(), toString()과 같은 메서드들도 오버라이딩 해주는 등 코드가 너무 장황해진다. 물론 lombok을 사용하면 이러한 부분을 간소화 할 수 있는데, 이를 보완 하기 위해 나온 기능이 Records이다. 단, 아직 Preview이기 때문에 --enable-preview 옵션을 줘야 사용할 수 있는 기능이다.

아래와 같이 구현할 수 있다.

1
record Point(int x, int y) { }
1
Point point = new Point(1, 2);

getter, setter, 생성자 등 구현하지 않아도 되며 equals(), hashcode(), toString() 기본적으로 오버라이딩 되어있다.
불변이고, 클레스이기 때문에 인스턴스 필드에 접근제어자를 붙일 수 없으며, 내부데이터를 변경 할 수 없다. (초기화 필드는 기본적으로 private final 이다.) 하지만 static 필드와 메서드를 가질 수 있다. 추가로 클래스를 상속 받을 수 없으며 인터페이스만 구현가능하다.

JEP 361: Switch Expressions (Standard)

이전 블로그인 Java12, Java13에서 Preview로 추가되었던 기능이 드디어 Stansard되었다. 기존 블로그를 참고하자.

JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector

CMS GC가 삭제 되었다. 기존 JAVA9에서 Deprecated되었는데 Java에서는 아예 삭제가 되었다.
ZGC의 MacOS와 Windows 지원이 이번 릴리즈에 포함된거 보면 (JEP 364JEP 365) G1GC나 ZGC를 이용하라는것 같다.

JEP 368: Text Blocks (Second Preview)

Java13에 Preview로 소개되었던 멀티라인 문자열 기능이 이번에 릴리즈 될 줄 알았건만… Second Preview로 다시 소개 되었다.
--enable-preview 옵션을 줘야 사용할 수 있는 기능이다.

멀티라인 문자열을 사용하기 위해서 아래와 같이 +\n 을 이용하여 문자열을 붙여야 했지만

1
2
3
4
5
6
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
`

아래와 같이 사용이 가능하다.

1
2
3
4
5
6
7
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";