JavaRush /Java Blog /Random-KO /자바 14: 새로운 기능은 무엇인가요?

자바 14: 새로운 기능은 무엇인가요?

Random-KO 그룹에 게시되었습니다
세상의 문제는 세상의 문제이며 새로운 Java는 예정대로 진행됩니다. 즉, 정확히 6개월에 한 번씩입니다. Java 14의 릴리스 버전은 3월 17일에 출시되었으며 개발자를 대상으로 언어에 몇 가지 흥미로운 혁신을 도입했습니다. 그 중에는 레코드자바 14: 새로운 기능은 무엇인가요?  - 1 키워드 에 대한 실험적 지원, " instanceof " 연산자 의 패턴 일치 지원 , 보다 사용자 친화적인 NullPointerExceptions , 텍스트 블록의 확장된 "미리 보기" , 업데이트된 기본 스위치 등이 있습니다. Java의 모든 혁신은 확장 제안( JEP, Java Enhancement Proposals ) 에서 시작된다는 점을 상기시켜 드리겠습니다 . 개발자는 변경 사항을 제안하고 "공식" Java 상위 요소의 검토를 받은 후 해당 변경 사항 중 일부가 승인된 후 JDK의 일부가 됩니다. 그리고 지금-모든 것이 순서대로 이루어졌습니다.

JEP 359: 기록

레코드라고도 알려진 레코드는 JDK 14의 미리 보기 모드에서 사용할 수 있으며 이는 Java의 완전히 새로운 기능입니다. 사실 우리 앞에는 Valhalla 프로젝트 중에 개발된 새로운 유형이 있습니다 . 레코드는 열거형과 유사하며 이를 통해 코드를 단순화할 수 있습니다. 기본적으로 상태는 있지만 동작이 없는 클래스를 대체합니다. 간단히 말해서, 필드만 있고 메서드는 없습니다. 클래스의 경우 생성자, 접근자, equals(), hashCode(), toString() 등 항상 필요하지 않은 반복적인 코드를 많이 작성해야 하는 경우가 있습니다. 이러한 반복적인 코드를 방지하기 위해 Java에서는 계획을 세웁니다. 기록을 사용합니다. 클래식 버전은 다음과 같습니다.
final class Triangle {
 	public final int x;
public final int y;
public final int z;

    public Triangle(int x, int y, int z) {
         this.x = x;
         this.y = y;
    this.z = z;
    }
    // equals, hashCode, toString
Java 14로 이동하여 레코드를 사용해 보겠습니다.
public record Triangle(int x, int y, int z){}
그게 다야. 녹음은 현재 미리보기 형식으로 존재하므로 실제로 시험해 보려면 jdk14를 다운로드하고 다음 명령을 입력해야 합니다.
javac —enable-preview —release 14 Triangle.java
비록 제한이 있기는 하지만 기록은 클래스입니다. 다른 클래스를 확장하거나 필드를 선언할 수 없습니다(상태 선언 구성 요소에 해당하는 private final 제외). 기록은 암묵적으로 최종적이며 추상적일 수 없습니다. 레코드는 API를 표현과 분리할 수 없다는 점에서 일반 클래스와 다릅니다. 그러나 자유의 상실은 정확성 증가로 보상됩니다. 레코드 구성 요소도 암시적으로 최종입니다.

JEP 305: 인스턴스에 대한 패턴 일치(미리보기)

Java 14의 미리 보기에 도입된 패턴 일치 기능은 객체 유형 확인과 인스턴스 오브 연산자의 변환을 결합하도록 설계되었습니다. 즉, Java 14 이전에는 다음과 같은 코드가 있었습니다.
Object object = Violin;

if (object instanceof Instrument) {
    Instrument instrument = (Instrument) object;
    System.out.println(instrument.getMaster());
}
보시다시피, 우리가 사용하려는 메서드가 있는 클래스에 객체를 캐스팅해야 합니다. 이제 Java 14 및 연결된 패턴 일치 기능을 사용하면 코드를 다음과 같이 줄일 수 있습니다.
Object object = Violin;

if (object instanceof Instrument instrument){
    System.out.println(instrument.getMaster());
}

JEP 343: 포장 도구(인큐베이터)

JDK 8에는 JavaFX용으로 설계된 javapackager 도구가 있습니다 . 그러나 JDK 11 출시로 Java에서 JavaFX가 분리됨에 따라 널리 사용되는 javapackager는 더 이상 사용할 수 없습니다. Javapackager는 패키징 도구였습니다. 이를 통해 Java 애플리케이션을 다른 모든 "일반" 프로그램처럼 설치할 수 있는 방식으로 패키지할 수 있었습니다. 예를 들어, Windows 사용자를 위한 exe 파일을 생성하고 더블 클릭만으로 사람처럼 Java 애플리케이션을 실행할 수 있습니다. 물론 이러한 도구는 매우 부족하므로 JEP 343에서는 Java 애플리케이션을 필요한 모든 종속성을 포함하는 플랫폼별 패키지로 패키징하는 새로운 도구인 jpackage를 도입했습니다. 특정 플랫폼에 대해 지원되는 패키지 형식:
  • 리눅스: deb와 rpm
  • macOS: pkg 및 dmg
  • 윈도우: MSI 및 EXE

JEP 345: G1에 대한 NUMA 인식 메모리 할당

JEP 345는 NUMA(Non-Uniform Memory Access) 지원을 구현하는 역할만 합니다. 이는 이기종 메모리 액세스 아키텍처로, 마이크로프로세서 클러스터를 메모리가 로컬로 분산될 수 있는 다중 프로세서 시스템으로 설정하는 방법입니다. 각 프로세서 코어는 소량의 로컬 메모리를 가져오고 다른 코어는 이에 액세스할 수 있습니다. JEP 345는 G1 가비지 수집기에 이러한 아키텍처를 활용할 수 있는 기능을 탑재할 계획입니다. 무엇보다도 이 접근 방식은 매우 강력한 시스템의 성능을 향상시키는 데 도움이 됩니다.

JEP 349: JFR 이벤트 스트리밍

JFR(Java Flight Recorder)은 이제 OpenJDK의 일부이므로 무료로 사용할 수 있습니다. JDK 14에는 JFR 이벤트(JDK Flight Recorder)의 실시간 추적을 위한 API가 추가되었으며, 특히 활성 및 비활성 애플리케이션의 지속적인 모니터링을 구성하기 위한 API가 추가되었습니다. 비스트리밍 옵션과 동일한 이벤트가 기록되며 오버헤드는 1% 미만입니다. 이렇게 하면 이벤트가 비스트리밍 옵션과 동시에 스트리밍됩니다. 그러나 JEP 349는 해당 소비자에 대한 동기식 콜백을 허용해서는 안 됩니다. 중간 메모리에 저장된 레코드의 데이터에도 접근할 수 없어야 합니다. 기술적으로 jdk.jfr 모듈의 jdk.jfr.consumer 패키지는 이벤트에 대한 비동기식 액세스 기능으로 확장됩니다.

JEP 352: 비휘발성 매핑 바이트 버퍼

우리가 알고 있듯이 Java NIO(New IO) File API는 JDK 1.4부터 있었고 Path라는 새로운 향상된 기능이 도입되었습니다. Path는 Java NIO에서 작업할 때 파일이나 디렉터리를 표현하는 java.io.File 클래스를 대체하는 인터페이스입니다. JEP 352는 MappedByteBuffer를 확장하여 파일 데이터의 일부를 NVM(비휘발성 메모리)에 로드합니다. 전원이 꺼져도 데이터가 손실되지 않는 이 컴퓨터 메모리(종종 읽기 전용 메모리라고도 함)는 데이터를 영구적으로 저장하는 데 사용됩니다. 이 Java 개선 제안은 JDK API를 위한 새로운 모듈과 클래스인 jdk.nio.mapmode 모듈을 제공합니다. 이 모듈은 NVM을 참조하는 매핑된 바이트 버퍼(MappedByteBuffer)를 생성하기 위한 새로운 모드(READ_ONLY_SYNC, WRITE_ONLY_SYNC)를 제공합니다.

JEP 358: 유용한 NullPointerException

NullPointerExceptions는 이제 프로그래머에게 더욱 친숙해졌습니다. 예외에 대한 설명이 이전보다 훨씬 더 많은 정보를 제공한다는 의미입니다. 이는 JVM이 프로그램 바이트코드 명령을 보다 정확하게 분석하도록 학습되었으며 어떤 변수가 0 값으로 이어지는지 나타낼 수 있기 때문입니다. 다음 코드가 있다고 가정해 보겠습니다.
a.getMessage().getUserInfo().getName()
최신 Java에서는 누가 정확히 null인지에 대한 질문에 대답하지 않는 일반적인 오류 로그가 표시됩니다.
Exception in thread "main" java.lang.NullPointerException
	at Main.main(Main.java:12)
이 미리보기 기능을 사용해 보기로 결정한 경우 Java 14에서 제공하는 기능은 다음과 같습니다.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "UserInfo().getName()" because the return value of "Message().getUserInfo()" is null
	at Main.main(Main.java:12)
이 체인은 훨씬 더 이해하기 쉽고 오류를 훨씬 더 빠르게 해결할 수 있게 해줍니다.

JEP 361: 스위치 표현식(표준)

업데이트된 Switch 연산자는 이전 Java 12 및 13에서 사용할 수 있었지만 미리 보기 기능으로만 제공되었습니다. 즉, 기본적으로 활성화되지 않았습니다. 이제 JDK 14에서는 모든 것이 즉시 작동합니다. Java 14에서는 케이스 L -> ... 레이블이 포함된 새롭고 단순화된 스위치 블록 형식을 도입합니다. 새로운 형식은 경우에 따라 코드를 단순화합니다. 다음은 몇 가지 예입니다. 요일을 설명하는 열거형이 있다고 가정해 보겠습니다. 클래식 코드를 작성할 수 있습니다(Java 14 이전).
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
다음은 Java 14를 사용하는 옵션입니다.
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
여러 줄의 블록을 작성하고 새로운 Yield 키워드를 사용하여 값을 반환할 수도 있습니다.
int result = switch (s) {
    case "Working from Home" -> 1;
    case "Working from Office" -> 2;
    default    -> {
        System.out.println("Neither Home nor Office… Cafe? Car? Park?...");
        yield 0;
    }
};
새 스위치를 사용할 때 명심해야 할 몇 가지 중요한 사항이 더 있습니다 . 특히 옵션은 철저해야 한다는 점을 기억해야 합니다. 즉, 가능한 모든 값에 대해 해당 스위치 레이블이 있어야 합니다. 이제 Yield가 키워드이기 때문에 Java 14에서는 Yield라는 클래스가 가능합니다. 일반적으로 업데이트된 스위치의 사용법을 배우고 싶다면 JEP 361 로 가서 공부하세요. 거기에는 흥미로운 정보가 많이 있습니다.

JEP 362: Solaris 및 SPARC 포트 지원 중단

많은 독자들이 Solaris 운영 체제 에 대해 기억할 것 같지 않습니다 . Java의 모회사인 Sun Microsystems가 만든 이 UNIX 기반 운영 체제는 주로 SPARC 아키텍처의 서버에 사용되었습니다. 평방 센티미터당 익숙하지 않은 단어가 너무 많습니까? 큰 문제는 아닙니다. JEP 362는 Solaris/SPARC, Solaris/x64 및 Linux/SPARC 플랫폼에 대한 지원을 종료합니다. 즉, 해당 포트는 현재 더 이상 사용되지 않으며 앞으로는 OpenJDK에서 제거될 가능성이 높습니다. 그러나 Solaris/SPARC, Solaris/x64 및 Linux/SPARC 포트와 관련된 이전 버전의 Java(JDK 14 이전)는 수정 없이 작동해야 합니다. 역사 애호가이고 그리 멀지 않은 과거의 기술에 관심이 있다면 Wikipedia로 이동하여 SPARС 아키텍처에 대해 읽어보세요 .

JEP 363: CMS(Concurrent Mark Sweep) 가비지 수집기 제거

CMS 가비지 수집기(Concurrent Mark Sweep)는 2년 전에 더 이상 사용되지 않는 것으로 표시되어 유지 관리되지 않은 상태로 남아 있으므로 제거 대상입니다. 그러나 CMS GC를 사용하는 이전 버전의 Java 사용자는 숨을 쉴 수 있습니다. 이 JEP의 목적은 이전 JDK 릴리스에서 빌더를 제거하는 것이 아닙니다. 또한 ParallelScavenge 및 SerialOld 가비지 수집 알고리즘("-XX:+UseParallelGC -XX:-UseParallelOldGC" 옵션으로 실행)의 조합은 더 이상 사용되지 않습니다.

JEP 364: macOS의 ZGCJEP 365: Windows의 ZGC

Z Garbage Collector(ZGC) 라는 흥미로운 가비지 수집기가 있습니다 . 패시브 모드에서 작동하며 가비지 수집으로 인한 지연을 최소화하려고 시도합니다. ZGC 사용 시 중지 시간은 10ms를 초과하지 않습니다. 작은 힙과 거대한 힙(수 테라바이트를 차지하는 힙)에서 작동할 수 있습니다. JEP 364와 JEP 365는 사실상 쌍둥이입니다. JEP 364는 Z Garbage Collector를 MacOS에 제공합니다. JEP의 일부는 JEP 351 에 지정된 대로 사용되지 않은 장치 메모리를 해제하기 위한 수집기 기능도 설명합니다 . 이는 Java 13부터 발생했습니다. macOS의 ZGC 구현은 두 부분으로 구성됩니다.
  • macOS에서 다중 매핑 메모리 지원
  • 지속적인 메모리 예약을 위한 ZGC 지원
JEP 365는 이미 Windows와 실험 모드에서 ZGC에 대한 지원을 제공합니다. 다음과 같습니다:
  • 다중 매핑 메모리 지원
  • 페이지 파일을 기반으로 예약된 주소 공간에 대한 메모리 매핑 지원
  • 힙의 임의 부분 매핑 및 매핑 해제 지원
  • 힙의 임의 부분 커밋 및 커밋 취소 지원

JEP 366: ParallelScavenge + SerialOld GC 조합 지원 중단

이 JEP는 병렬 청소 및 직렬 오래된 가비지 수집 알고리즘의 조합을 더 이상 사용하지 않습니다. 이 조합은 명령줄 매개변수 -XX: + UseParallelGC -XX: -UseParallelOldGC를 사용하여 수동으로 활성화해야 했습니다. 저자는 이 조합이 매우 구체적이지만 상당한 유지 관리 노력이 필요하다고 생각합니다. 이제 -XX: UseParallelOldGC 옵션은 더 이상 사용되지 않으며 사용하면 경고가 표시됩니다.

JEP 367: Pack200 도구 및 API 제거

Pack200은 컴파일된 Java 클래스 파일을 저장하는 데 최적화된 아카이브 형식입니다. 이 도구는 Java 11부터 더 이상 사용되지 않는 것으로 표시되었습니다. 이제 pack200, unpack200 및 Pack200 API 도구가 java.util.jar 패키지 에서 제거되도록 공식적으로 발표되었습니다 . 이 기술은 매우 제한된 대역폭(모뎀, 56k라고 말하고 기억하기가 무섭습니다)과 하드 드라이브의 부족한 저장 공간을 처리하는 수단으로 Java 5에서 다시 도입되었습니다. 얼마 전 Java 9에서는 새로운 압축 방식이 도입되었습니다. 개발자는 jlink 를 사용하는 것이 좋습니다 .

JEP 368: 텍스트 블록(두 번째 미리보기)

텍스트 블록은 Java 13에서 처음 등장했습니다. 텍스트 블록은 대부분의 이스케이프 시퀀스가 ​​필요하지 않고 자동으로 문자열 형식을 지정하며 필요한 경우 개발자가 문자열 형식을 지정할 수 있도록 하는 여러 줄 문자열 리터럴입니다. 이 유용한 기능은 이제 Java 14(2차 미리보기)에서 사용할 수 있습니다. 텍스트 블록의 주요 목적은 혼란스러운 여러 줄 리터럴의 처리를 개선하는 것입니다. 이를 통해 SQL 쿼리, HTML 및 XML 코드, JSON을 읽고 쓰는 것이 크게 단순화됩니다. 텍스트 블록이 없는 HTML 예:
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, JavaRush Student</p>\n" +
              "    </body>\n" +
              "</html>\n";
텍스트 블록으로 동일하게 표현하는 방법:
String html = """
              <html>
                  <body>
                      <p>Hello, JavaRush Student</p>
                  </body>
              </html>
              """;
여는 구분 기호 는 세 개의 큰따옴표 문자("" ")와 0개 이상의 공백, 줄 구분 기호로 구성됩니다. 내용은 여는 구분 기호의 줄 구분 기호 뒤의 첫 번째 문자에서 시작됩니다. 닫는 구분 기호는 다음과 같습니다 . 문자가 이스케이프되지 않고 표시될 수 있도록 세 개의 큰따옴표 문자 " _ )가 선택되었으며 텍스트 블록과 문자열 리터럴을 시각적으로 구별할 수도 있습니다. 2019년 초 JEP 355는 JEP 326(원시 문자열 리터럴)의 연속으로 텍스트 블록을 제안했지만 철회되었습니다. 그해 후반에 JDK 13에는 텍스트 블록 미리 보기 기능이 도입되었으며 이제 Java 14에는 두 개의 새로운 이스케이프 시퀀스가 ​​추가되었습니다. 이것은 \로 표시되는 줄 종결자이고, 두 번째는 /s로 표시되는 단일 공백용입니다. 텍스트 블록 없이 줄 바꿈을 사용하는 예:
String literal = "This is major Tom to Ground Control " +
"I am stepping through the door... " +
"Wait… What???";
이제 이스케이프 시퀀스 \<line-terminator>를 사용합니다.
String text = """
                This is major Tom to Ground Control \
                I am stepping through the door... \
                WaitWhat???\
                """;
이스케이프 시퀀스 \s는 기본적으로 컴파일러에서 무시되는 후행 공백을 설명하는 데 사용됩니다. 앞에 오는 모든 공백을 유지합니다. 예:
String text1 = """
               line1
               line2 \s
               line3
               """;

String text2 = "line1\nline2 \nline3\n";
text1그리고 text2동일합니다.

JEP 370: 외부 메모리 액세스 API(인큐베이터)

많은 인기 있는 Java 라이브러리와 프로그램은 외부 메모리에 액세스할 수 있습니다. 예를 들어 Ignite, MapDB, Memcached 및 Netty ByteBuf API가 있습니다. 이렇게 하면 가비지 수집(특히 대규모 캐시를 제공할 때)과 관련된 비용 및 예측 불가능성을 방지하고, 여러 프로세스에서 메모리를 공유하고, 메모리에 파일을 매핑하여(예: mmap 사용) 메모리 콘텐츠를 직렬화 및 역직렬화할 수 있습니다. 그러나 Java API에는 아직 외부 메모리에 액세스하는 데 적합한 솔루션이 없습니다. JDK 14 에는 Java 애플리케이션이 새로운 MemorySegment, MemoryAddress 및 MemoryLayout 추상화를 사용하여 JVM 힙 외부의 메모리 영역에 안전하고 효율적으로 액세스할 수 있도록 하는 외부 메모리 액세스 API 의 미리 보기가 포함되어 있습니다 .

결론

그래서 당신은 어떻게 생각하십니까? Java 13과 비교하여 새로운 Java 14는 다양한 영역에서 훨씬 더 중요한 개선 사항을 제공합니다. 아마도 개발자에게 가장 중요한 것은 업데이트된 스위치, 확장된 예외 NullPointerException 및 레코드일 것입니다. 아니면?.. Java 14의 새로운 기능을 시험해 보는 것을 잊지 마세요. 이는 초보자에게도 매우 유용합니다. 공부에 행운이 있기를 바랍니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION