본문 바로가기
내 맘대로 포스팅

JAVA 21: WHAT’S NEW ?

by 형큐 2023. 8. 12.
SMALL

https://www.loicmathieu.fr/wordpress/en/informatique/java-21-quoi-de-neuf/

 

Java 21: what’s new ? | Loic's Blog

Now that Java 21 is features complete (Rampdown Phase Two at the day of writing), it’s time to walk through all the functionalities that bring to us, developers, this new version. This article is part of a series on what’s new on the last versions of J

www.loicmathieu.fr


  • Java 21 은 새로운 LTS 버전으로 2년간 지원될 예정
  • 가장 중요한 것은 Virtual Threads의 완성
  • JEP 430: String Templates (Preview) - String Interpolation 지원
  • JEP 431: Sequenced Collections - 컬렉션 API에 많은 기능들 추가
  • JEP 443: Unnamed Patterns and Variables (Preview) - "_" 를 익명의 패턴/변수로 활용
  • JEP 445: Unnamed Classes and Instance Main Methods (Preview) - Main 메소드를 간략화해서 간단한 자바코드는 더 쉽게 작성 가능
  • Preview 종료하는 피쳐들:
    • JEP 440 – Record Patterns
    • JEP 441 – Pattern Matching for switch
    • JEP 444 – Virtual Threads
  • Preview 로 남는 피쳐들
    • JEP 442 – Foreign Function & Memory API (Third Preview)
    • JEP 448 – Vector API
    • JEP 446 – Scoped Values (Preview)
    • JEP 453 – Structured Concurrency (Preview)

JEP 400: 기본값 UTF-8

JEP 400을 사용하면 모든 OS 및 모든 로캘에서 기본 문자셋이 UTF-8이 됩니다.
file.encoding 시스템 속성을 사용하여 다른 기본 문자셋을 구성하거나 이전 모드로 되돌리기 위해 COMPAT으로 구성할 수 있습니다.

자세한 내용은 JEP-400을 참조하세요.

JEP 413: Java API 문서의 코드 스니펫

코드 조각을 정의하는 데 사용할 수 있는 새로운 JavaDoc @스니펫 태그가 추가되었습니다. 이 태그는 기존 @code 태그보다 유연하고 특수 문자를 이스케이프 처리할 필요가 없으며 외부 파일의 코드 스니펫을 포함할 수도 있습니다.

JavaDoc 내에 정의된 조각의 예시:

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 * }
 * }
 */

JavaDoc 외부에 정의된 조각의 예입니다:

 

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet file="ShowOptional.java" region="example"}
 */

이 조각은 ShowOptional.java 파일의 예제 섹션을 가리킵니다:

public class ShowOptional {
    void show(Optional<String> v) {
        // @start region="example"
        if (v.isPresent()) {
            System.out.println("v: " + v.get());
        }
        // @end
    }
}

외부 조각을 포맷하고 포함하는 데는 몇 가지 가능한 옵션이 있으며, 조각이 실행 가능한 상태가 되면 예를 들어 JUnit 테스트에서 정의하여 나머지 코드와 함께 테스트할 수도 있습니다.
이 글에서 Gunnar Morling의 더 많은 예제를 확인하세요: 실행 가능한 JavaDoc 코드 스니펫 .

자세한 내용은 JEP-413에서 확인하세요.

JEP 408: 간단한 웹 서버

이 JEP는 명령줄 도구를 통해 디렉터리에서 정적 파일을 제공할 수 있는 미니멀리스트 웹 서버인 jwebserver를 OpenJDK 배포에 추가합니다.

기본적으로 이 웹 서버는 로컬 호스트(-b를 통해 구성 가능)에 바인딩하고 포트 80(-p를 통해 구성 가능)을 사용하며 현재 디렉터리(-d를 통해 구성 가능)에서 정적 파일을 제공합니다.
각 액세스는 표준 출력에 기록됩니다.

명령줄 도구 외에도 SimpleFileServer 클래스를 사용하여 Java API를 통해 웹 서버를 인스턴스화할 수 있습니다.

var server = SimpleFileServer.createFileServer(new InetSocketAddress(8080), 
        Path.of("/some/path"), OutputLevel.VERBOSE);
server.start()

줄리아 보스의 간단한 웹 서버로 작업하기 문서에서 Java API 사용법에 대한 더 많은 예제를 확인하세요.

자세한 내용은 JEP-408에서 확인하세요.

JEP 421: 제거를 위한 마무리 사용 중단

파이널라이제이션은 객체가 소멸되기 직전에 자동으로 작업을 수행할 수 있는 메커니즘입니다. 이 메커니즘에는 여러 가지 문제가 있는데, 그중에서도 이러한 작업이 수행되는 시점을 가비지 컬렉션으로 지연시키고 잘못 코딩된 finalize() 메서드가 소멸될 참조를 다시 생성할 수 있다는 점이 가장 큰 문제입니다.

Java 9과 Object 클래스의 finalize() 메서드가 더 이상 사용되지 않으므로 더 이상 사용하지 않는 것이 좋으며, 클래스에 연결된 리소스를 해제하려면 try-with-resource 또는 새로운 Cleaner API와 같은 다른 메커니즘을 사용하는 것이 좋습니다.

JEP 421은 최종화 메커니즘 자체를 제거하기 위해 감가상각을 중단함으로써 최종화 제거를 한 단계 더 발전시켰습니다. 이제 JVM 옵션 --finalization=disabled를 통해 최종화 없이 코드를 테스트할 수 있습니다.

자세한 내용은 JEP 421에서 확인하세요.

내부 변경 사항, 성능 및 보안

JDK의 각 새 버전은 성능 최적화(GC 및 인트리직 메서드 포함) 및 보안 개선을 제공합니다. 이번 버전에서도 G1 GC(기억된 집합 관리 개선, JDK-8017163 참조) 및 병렬 GC와 문자열 인코딩 관리의 최적화를 주목할 수 있습니다.
또 다른 주목할 만한 추가 사항은 가비지 컬렉터인 Serial GC, Parallel GC 및 ZGC에 대한 문자열 중복 제거를 지원하는 것입니다.

또한 JVM의 내부 메커니즘에 대한 두 가지 중요한 JEP도 주목할 수 있습니다:

  • JEP 418 : Internet-Address Resolution SPI: possibility to change the default implementation of internet address resolution.
  • JEP 416 : Reimplement Core Reflection with Method Handles: previously there have been three implementations to make dynamic method calls: VM native method (internal), dynamic bytecode and Unsafe (used by java.lang.reflect), and finally method handles (java.lang.invoke). The reflection API (java.lang.reflect) has been rewritten to use the MethodHandle API to remove one of them.
  • JEP 418 : 인터넷 주소 확인 SPI: 인터넷 주소 확인의 기본 구현을 변경할 수 있습니다.
  • JEP 416 : 메서드 핸들로 코어 리플렉션 재구현: 이전에는 동적 메서드 호출을 위한 세 가지 구현이 있었습니다: VM 네이티브 메서드(내부), 동적 바이트코드 및 안전하지 않음(java.lang.reflect에서 사용), 마지막으로 메서드 핸들(java.lang.invoke)이었습니다. 이 중 하나를 제거하기 위해 메서드 핸들 API를 사용하도록 리플렉션 API(java.lang.reflect)가 재작성되었습니다.

보안 측면에서 다른 변경 사항이 구현되었으며, 이 주제에 대한 Sean Mullan의 이 글을 읽어보실 수 있습니다: JDK 18 보안 향상.

미리 보기로 유지되는 기능

다음 기능은 미리 보기(또는 인큐베이터 모듈)에 남아 있습니다.

이에 대한 자세한 내용은 이전 글을 참조하세요.

  • JEP-417 - 벡터 API: 기능의 세 번째 인큐베이션.
  • JEP-419 - 외부 함수 및 메모리 API: 이 두 가지 기능을 단일 JEP에 결합한 두 번째 인큐베이터.
  • JEP-420 - 스위치용 패턴 매칭: 일부 기능이 개선된 두 번째 프리뷰.

기타

다양한 JDK 추가:

  • Duration.isPositive()
  • Math and StrictMath saw the addition of many new methods : ceilDiv, ceilDivExact, ceilMod, divideExact, floorDivExact and unsignedMultiplyHigh

JDK 18의 모든 새로운 API는 Java 버전 연감 - Java 18의 새로운 API에서 확인할 수 있습니다.

결론

이 새로운 버전의 Java는 많은 새로운 기능을 제공하지는 않지만, 파나마 프로젝트(벡터 API, 외부 함수 및 메모리 API)를 발전시킵니다. Java 19에서는 Loom(경량 스레드) 및 발할라(값/인라인/원시 클래스) 프로젝트의 첫 번째 JEP가 작성 중이며, 이 프로젝트의 첫 번째 JEP를 기대합니다.

삭제가 곧 이루어지지는 않더라도 이 방향에 대한 강력한 신호라는 점은 여전히 주목해야 합니다.

반응형
LIST