1. 개요

Java 14는 2020 년 3 월 17 일에 릴리스되었으며, Java의 새 릴리스주기에 따라 이전 버전 보다 정확히 6 개월 뒤 입니다.

이 사용방법(예제)에서는 언어 버전 14의 새로운 기능과 더 이상 사용되지 않는 기능에 대한 요약을 살펴 봅니다 .

또한  새로운 기능에 대한 심층적 인보기를 제공하는 Java 14에 대한 자세한 기사 있습니다.

2. 이전 버전에서 이어온 기능

이전 버전의 Java 14에서는 몇 가지 기능이 이전되었습니다. 하나씩 살펴 보겠습니다.

2.1. 스위치 표현식 ( JEP 361 )

이 기능은 JDK 12의 미리보기 기능으로 처음 도입되었으며 Java 13에서도 미리보기 기능으로 만 계속되었습니다. 그러나 이제 스위치 표현식 이 표준화되어 개발 키트의 일부이자 소포입니다 .

이것이 효과적으로 의미하는 것은이 기능이 이제 개발자가 실험 할 미리보기 모드가 아닌 프로덕션 코드에서 사용할 수 있다는 것입니다.

간단한 예로 요일을 평일 또는 주말로 지정하는 시나리오를 고려해 보겠습니다.

이 개선 사항 이전에는 다음과 같이 작성했습니다.

boolean isTodayHoliday;
switch (day) {
    case "MONDAY":
    case "TUESDAY":
    case "WEDNESDAY":
    case "THURSDAY":
    case "FRIDAY":
        isTodayHoliday = false;
        break;
    case "SATURDAY":
    case "SUNDAY":
        isTodayHoliday = true;
        break;
    default:
        throw new IllegalArgumentException("What's a " + day);
}

스위치 표현식을 사용하면 동일한 내용을 더 간결하게 작성할 수 있습니다.

boolean isTodayHoliday = switch (day) {
    case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> false;
    case "SATURDAY", "SUNDAY" -> true;
    default -> throw new IllegalArgumentException("What's a " + day);
};

2.2. 텍스트 블록 ( JEP 368 )

텍스트 블록 은 주류 업그레이드를위한 여정을 계속하며 미리보기 기능으로 계속 사용할 수 있습니다.

JDK 13의 기능 외에도 여러 줄 문자열을 사용하기 쉽게 만드는 두 번째 미리보기에서 텍스트 블록에는 이제 두 개의 새로운 이스케이프 시퀀스가 ​​있습니다 .

  • \ : 줄의 끝을 나타 내기 위해 새 줄 문자가 도입되지 않습니다.
  • \ s : 단일 공백 ​​표시

예를 들면 :

String multiline = "A quick brown fox jumps over a lazy dog; the lazy dog howls loudly.";

이제 다음과 같이 작성할 수 있습니다.

String multiline = """
    A quick brown fox jumps over a lazy dog; \
    the lazy dog howls loudly.""";

이것은 인간의 눈에 대한 문장의 가독성을 향상 시키지만 뒤에 줄 바꿈을 추가하지는 않습니다 . .

3. 새로운 미리보기 기능

3.1. instanceof에 대한 패턴 매칭 ( JEP 305 )

JDK 14는 상용구 코드를 제거하고 개발자의 삶을 조금 더 쉽게 만들기 위해 들어 패턴 매칭을 도입했습니다 .

이를 이해하기 위해 간단한 예를 살펴 보겠습니다.

이 기능 이전에 다음과 같이 작성했습니다.

if (obj instanceof String) {
    String str = (String) obj;
    int len = str.length();
    // ...
}

이제 obj 를 String으로 사용하기 위해 많은 코드가 필요하지 않습니다 .

if (obj instanceof String str) {
    int len = str.length();
    // ...
}

향후 릴리스에서 Java는 switch 와 같은 다른 구성에 대한 패턴 일치를 제공 할 것 입니다.

3.2. 기록 ( JEP 359 )

데이터 모델 POJO에서 반복적 인 상용구 코드를 줄이기 위해 레코드 가 도입되었습니다. 일상적인 개발을 단순화하고 효율성을 개선하며 인적 오류의 위험을 크게 최소화합니다 .

예를 들어,에 대한 데이터 모델  사용자ID암호를 간단하게 정의 할 수 있습니다 :

public record User(int id, String password) { };

보시다시피 여기에 새 키워드 인 record를 사용하고 있습니다 . 이 간단한 선언은 자동으로 생성자, getters, equals , hashCodetoString 메소드를 추가합니다.

JUnit을 사용하여이 작업을 살펴 ​​보겠습니다.

private User user1 = new User(0, "UserOne");

@Test
public void givenRecord_whenObjInitialized_thenValuesCanBeFetchedWithGetters() {
    assertEquals(0, user1.id());
    assertEquals("UserOne", user1.password());
}

@Test
public void whenRecord_thenEqualsImplemented() {
    User user2 = user1;
    assertTrue(user1, user2);
}

@Test
public void whenRecord_thenToStringImplemented() {
    assertTrue(user1.toString().contains("UserOne"));
}

4. 새로운 생산 기능

두 가지 새로운 미리보기 기능과 함께 Java 14는 구체적인 프로덕션 준비 기능도 제공했습니다.

4.1. 유용한  NullPointerExceptions ( JEP 358 )

이전에 NullPointerException에 대한 스택 추적 에는 주어진 파일의 주어진 줄에서 일부 값이 null이라는 점을 제외하고는 말할 내용이 많지 않았습니다.

이 정보는 유용하지만 개발자가 로그를보고 이해할 수 있도록 전체 그림을 그리는 대신 디버그 할 줄만 제안했습니다.

이제 Java는 주어진 코드 줄에서 정확히 null이 무엇인지 지적하는 기능을 추가하여 이를 쉽게 만들었습니다 .

예를 들어 다음과 같은 간단한 스 니펫을 고려하십시오.

int[] arr = null;
arr[0] = 1;

이전에는이 ​​코드를 실행할 때 로그에 다음과 같이 표시됩니다.

Exception in thread "main" java.lang.NullPointerException
at com.baeldung.MyClass.main(MyClass.java:27)

그러나 이제 동일한 시나리오가 주어지면 로그에 다음과 같이 표시 될 수 있습니다.

java.lang.NullPointerException: Cannot store to int array because "a" is null

보시다시피 이제 어떤 변수가 예외를 일으켰는지 정확히 알 수 있습니다.

5. 배양 기능

이들은 Java 팀이 제안하고 실험을 위해 제공하는 최종 API 및 도구입니다. 미리보기 기능과 다르며 jdk.incubator 패키지에 별도의 모듈로 제공됩니다 .

5.1. 외부 메모리 액세스 API ( JEP 370 )

이것은 Java 프로그램이 안전하고 효율적인 방식으로 힙 외부의 원시 메모리와 같은 외부 메모리에 액세스 할 수 있도록 하는 새로운 API 입니다.

mapDBmemcached 와 같은 많은 Java 라이브러리 는 외부 메모리에 액세스하며 Java API 자체가 더 깨끗한 솔루션을 제공 할 때였 습니다. 이러한 의도로 팀은 힙이 아닌 메모리에 액세스하는 기존 방법 인 ByteBuffer API 및 sun.misc.Unsafe API에 대한 대안으로이 JEP를 고안했습니다 .

MemorySegment , MemoryAddressMemoryLayout 의 세 가지 주요 추상화를 기반으로 구축 된 이 API는 힙 및 비힙 메모리에 모두 액세스하는 안전한 방법입니다.

5.2. 패키징 도구 ( JEP 343 )

전통적으로 Java 코드를 전달하기 위해 응용 프로그램 개발자는 사용자가 자신의 JVM 내에서 실행해야하는 JAR 파일을 간단히 보냅니다.

그러나 사용자 는 Windows 또는 macOS와 같은 기본 플랫폼에 패키지를 설치하기 위해 두 번 클릭하는 설치 프로그램을 기대했습니다 .

이 JEP는이를 정확하게 수행하는 것을 목표로합니다. 개발자는 jlink사용 하여 JDK를 최소 필수 모듈로 압축 한 다음이 패키징 도구를 사용하여 Windows 에서 exe 로 설치 하거나 macOS 에서 dmg 로 설치할 수있는 경량 이미지를 만들 수 있습니다 .

6. JVM / 핫스팟 기능

6.1. Windows ( JEP 365 ) 및 macOS ( JEP 364 )의 ZGC – 실험용

Z 가비지 수집기 , 확장 성, 낮은 레이턴시 가비지 수집기가 제 기능을 실험적으로 자바 (11)에 도입 하였다. 하지만 처음에 지원되는 플랫폼은 Linux / x64뿐이었습니다.

Linux 용 ZGC에 대한 긍정적 인 피드백을받은 후 Java 14는 Windows 및 macOS에서도 지원을 포팅했습니다 . 아직 실험적인 기능이지만 다음 JDK 릴리스 에서 프로덕션 준비가 완료 되었습니다 .

6.2. G1에 대한 NUMA 인식 메모리 할당 ( JEP 345 )

병렬 수집기와 달리 G1 가비지 수집기에 대해 NUMA (Non-uniform Memory Access)가 지금까지 구현되지 않았습니다.

여러 소켓에서 단일 JVM을 실행하기 위해 제공하는 성능 향상을 살펴보면 이 JEP는 G1 콜렉터가 NUMA를 인식하도록하기 위해 도입되었습니다 .

이 시점에서 다른 HotSpot 수집기에 동일한 항목을 복제 할 계획이 없습니다.

6.3. JFR 이벤트 스트리밍 ( JEP 349 )

이 향상된 기능으로 JDK의 비행 레코더 데이터가 노출되어 지속적으로 모니터링 할 수 있습니다. 여기에는 jdk.jfr.consumer 패키지에 대한 수정이 포함 되어 사용자가 이제 레코딩 데이터를 직접 읽거나 스트리밍 할 수 있습니다.

7. 더 이상 사용되지 않거나 제거 된 기능

Java 14는 다음 두 가지 기능을 더 이상 사용하지 않습니다.

  • Solaris 및 SPARC 포트 ( JEP 362 ) –이 Unix 운영 체제 및 RISC 프로세서는 지난 몇 년 동안 활발하게 개발되지 않았기 때문입니다.
  • ParallelScavenge + SerialOld GC 조합 ( JEP 366 ) – 거의 사용되지 않는 GC 알고리즘 조합이며 상당한 유지 관리 노력이 필요하기 때문입니다.

또한 몇 가지 제거가 있습니다.

  • CMS (Concurrent Mark Sweep) 가비지 수집기 ( JEP 363 ) – Java 9에서 더 이상 사용되지 않으며이 GC는 기본 GC로 G1에 의해 성공했습니다. 또한 ZGC 및 Shenandoah와 같이 현재 사용할 수있는 다른 성능 대안이 있으므로 제거
  • Pack200 도구 및 API ( JEP 367 ) – Java 11에서 제거하기 위해 더 이상 사용되지 않으며 이제 제거되었습니다.

8. 결론

이 예제에서는 Java 14의 다양한 JEP를 살펴 보았습니다.

모두에서는, 언어의이 릴리스 (16 개) 주요 기능이 있습니다 미리보기 기능, 인큐베이터, 중단 된 및 제거 포함하여. 우리는 그것들을 하나씩 살펴 보았고 예제와 함께 언어 기능을 살펴 보았습니다.

항상 그렇듯이 소스 코드는 GitHub에서 사용할 수 있습니다 .