본문 바로가기
개발/JAVA

Java 12-17 변경점

by Remover 2021. 10. 3.
반응형

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
}

 

JEP 359: Records (Preview)

 - 불변 데이터 객체를 간단하게 작업 할 수 있는 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.ByteBuffersun.misc.Unsafe 두 가지 방식

 

ByteBuffer API

직접 off-heap을 생성 할 수 있고 이러한 Buffer는 Java에서 직접 접근이 가능하나 제한 사항이 존재.

 - Buffer 크기는 2GB로 제한됨.

 - Garbage Collector가 메모리 할당 해제를 담당

따라서 잘못 사용하면 메모리 누수 혹은 OutOfMemory가 발생(사용되지 않는 메모리 참조가 GC의 메모리 할당 해제를 방해 할 수 있음.)

 

UnSafe API

매우 효율적이나 단점이 존재

 - 잘못된 메모리 사용으로 인한 JVM 충돌

 - 비표준 Java API

 

 

JEP 361: Switch Expressions

 - 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

JEP 378: Text Blocks

 - 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

 

JEP 371: Hidden Classes

 - Hidden Class 는 다른 Class들의 byteCode에서 직접 호출 될 수 없는 클래스.

 - 프레임워크/언어 처리에서는 일반적으로 동적으로 생성된 클래스가 정적으로 생성된 클래스 구현에 공개되지 않고 접근하지 못하게 할 필요성이 있기 때문.(참고)

 

Java 16

JEP 392: Packaging Tool

JEP 394: Pattern Matching for instanceof

JEP 395: Records

 - 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

댓글