LTS Java 11 다음인 17이 발표 됨에 따라서 12~17까지의 변화를 나열해보려고 합니다.
Java 12
JEP 325: Switch Expressions (Preview)
- Switch Expression 변경에 대한 Preview
String a = switch(obj) {
case "AAA", "BBB", "CCC" -> "c";
default -> "";
};
Java 13
JEP 351: ZGC: Uncommit Unused Memory (Experimental)
- 사용하지 않는 Heap Memory를 운영체제에 반환하도록 ZGC를 변경(실험단계)
JEP 354: Switch Expressions (Second Preview)
- Switch Expression 변경에 대한 두 번째 Preview 제공.
// Preview
String a = switch(obj) {
case "AAA", "BBB", "CCC" -> "c";
default -> "";
};
// Second Preview
// {} 안에서 return 하는 경우 yield 라는 예약어 사용
String a = switch(obj) {
case "AAA", "BBB", "CCC" -> "c";
case "DDD" -> {
String a = "1";
a += "2";
yield a;
}
default -> "";
};
JEP 355: Text Blocks (Preview)
- Text Block, MultiLine Text에 대한 Preview
// 기존 MultiLine Text
String text = "SELECT *\n"
+ "FROM person\n"
+ "WHERE id = 1;";
// 변경
String text = """
SELECT *
FROM person
WHERE id = 1;
""";
JEP 353: Reimplement the Legacy Socket API
- JDK 1.0에 작성했던 Socket API를 다시 구현
Java 14
JEP 305: Pattern Matching for instanceof (Preview)
- instanceof 변경점 Preview
// 기존
if (obj instanceof String) {
String s = (String) obj;
// use s
}
// 변경
if (obj instanceof String s) {
// can use s here
} else {
// can't use s here
}
- 불변 데이터 객체를 간단하게 작업 할 수 있는 Record Preview.
- Lombok과 비슷함(@Getter)
public class App {
public static void main(String[] args) throws Exception {
InnerApp app = new InnerApp("name", 1);
System.out.println(app.name);
}
/**
* InnerApp
*/
public record InnerApp(String name, Integer age) {};
}
JEP 343: Packaging Tool (Incubator)
- Packaging Tool 제공(Incubator) 함으로써 OS에 맞게 Package 가능
- Windows : msi, exe
- Linux : deb, rpm
- Mac : pkg, dmg
$ javac App.java
$ jar -cvf App.jar App.class
# Linux : deb, rpm
# Windows : msi, exe
# Mac : pkg, dmg
$ jpackage --name hello_app --input test --main-jar App.jar --main-class App
JEP 370: Foreign-Memory Access API (Incubator)
- Native Memory에 보다 안전하고 효율적으로 액세스 하기 위해 Foreign-Memory Access API를 도입
- 기존에 Java가 기본 메모리에 액세서 하는 방식은 java.nio.ByteBuffer 와 sun.misc.Unsafe 두 가지 방식
ByteBuffer API
직접 off-heap을 생성 할 수 있고 이러한 Buffer는 Java에서 직접 접근이 가능하나 제한 사항이 존재.
- Buffer 크기는 2GB로 제한됨.
- Garbage Collector가 메모리 할당 해제를 담당
따라서 잘못 사용하면 메모리 누수 혹은 OutOfMemory가 발생(사용되지 않는 메모리 참조가 GC의 메모리 할당 해제를 방해 할 수 있음.)
UnSafe API
매우 효율적이나 단점이 존재
- 잘못된 메모리 사용으로 인한 JVM 충돌
- 비표준 Java API
- Switch Expression 정식 변경
JEP 358: Helpful NullPointerExceptions
- NPE에 대한 메시지 표시 개선
- JVM Option에 -XX:+ShowCodeDetailsInExceptionMessages 옵션 추가
// 기존
Exception in thread "main" java.lang.NullPointerException
at Prog.main(Prog.java:5)
// 변경
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "App$A.getA()" because "a" is null
at App.main(App.java:7)
JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
- CMS Garbage Collector가 제거됨
JEP 368: Text Blocks (Second Preview)
- Text Blocks에 대한 두 번째 Preview
JEP 364: ZGC on macOS (Experimental)
JEP 365: ZGC on Windows (Experimental)
- macOS와 Windows에 대한 ZGC
Java 15
- Text Blocks의 정식
JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
- 새로운 암호화 알고리즘 EdDSA 추가
JEP 360: Sealed Classes (Preview)
- 부모 클래스가 허용된 모든 자식 클래스가 무엇인지 명확하게 하도록 하는 기능(Preview)
public abstract sealed class Shape
permits com.example.polar.Circle,
com.example.quad.Rectangle,
com.example.quad.simple.Square {...}
JEP 375: Pattern Matching for instanceof (Second Preview)
- 변경된 instanceof의 두 번째 Preview
JEP 383: Foreign-Memory Access API (Second Incubator)
- 외부 메모리 접근 API
- Hidden Class 는 다른 Class들의 byteCode에서 직접 호출 될 수 없는 클래스.
- 프레임워크/언어 처리에서는 일반적으로 동적으로 생성된 클래스가 정적으로 생성된 클래스 구현에 공개되지 않고 접근하지 못하게 할 필요성이 있기 때문.(참고)
Java 16
JEP 394: Pattern Matching for instanceof
- Packaging Tool, instanceof, Records의 정식 사용
JEP 397: Sealed Classes (Second Preview)
Java 17
JEP 406: Pattern Matching for switch (Preview)
- switch의 Parrern Matching Preview
record Point(int i, int j) {}
enum Color { RED, GREEN, BLUE; }
static void typeTester(Object o) {
switch (o) {
case null -> System.out.println("null");
case String s -> System.out.println("String");
case Color c -> System.out.println("Color with " + Color.values().length + " values");
case Point p -> System.out.println("Record class: " + p.toString());
case int[] ia -> System.out.println("Array of ints of length" + ia.length);
default -> System.out.println("Something else");
}
}
JEP 356: Enhanced Pseudo-Random Number Generators
- 향상된 난수 생성
public class App {
public static void main(String[] args) throws Exception {
RandomGenerator random = RandomGenerator.of("Xoshiro256PlusPlus");
RandomGenerator random1 = RandomGenerator.of("Xoroshiro128PlusPlus");
RandomGenerator random2 = RandomGenerator.of("L32X64MixRandom");
RandomGenerator random4 = RandomGenerator.of("L64X128MixRandom");
RandomGenerator random5 = RandomGenerator.of("L64X128StarStarRandom");
RandomGenerator random6 = RandomGenerator.of("L64X256MixRandom");
RandomGenerator random7 = RandomGenerator.of("L64X1024MixRandom");
RandomGenerator random8 = RandomGenerator.of("L128X128MixRandom");
RandomGenerator random9 = RandomGenerator.of("L128X256MixRandom");
RandomGenerator random10 = RandomGenerator.of("L128X1024MixRandom");
System.out.println("random : " + random.nextInt(10));
System.out.println("random1 : " + random1.nextInt(10));
System.out.println("random2 : " + random2.nextInt(10));
System.out.println("random4 : " + random4.nextInt(10));
System.out.println("random5 : " + random5.nextInt(10));
System.out.println("random6 : " + random6.nextInt(10));
System.out.println("random7 : " + random7.nextInt(10));
System.out.println("random8 : " + random8.nextInt(10));
System.out.println("random9 : " + random9.nextInt(10));
System.out.println("random10 : " + random10.nextInt(10));
}
}
random : 7
random1 : 2
random2 : 2
random4 : 2
random5 : 4
random6 : 5
random7 : 5
random8 : 7
random9 : 8
random10 : 7
'개발 > JAVA' 카테고리의 다른 글
JAVA 17~21 변경점 (1) | 2023.10.20 |
---|---|
[6주차] 입출력 스트림 요약 정리 (0) | 2020.03.14 |
[5주차] 직접 정리한 키워드 공유하기 - 혼자 공부하는 자바 (0) | 2020.03.08 |
[4주차] 직접 해보는 손코딩! Thread (0) | 2020.02.29 |
[3주차] 혼공 용어노트 활용 (0) | 2020.02.22 |
댓글