웹사이트 검색

자바 14 기능


6개월 주기 전통에 따라 2019년 9월 17일에 Java 13이 릴리스된 후 Java 14, 또 다른 비 LTS 버전이 2020년 3월 17일에 릴리스될 예정입니다.

자바 14 기능

Java 14 기능 목록은 다음과 같습니다.

  • 스위치 식(표준) - JEP 361
  • instanceof에 대한 패턴 일치(미리 보기) - JEP 305
  • 유용한 NullPointerExceptions - JEP 358
  • 레코드(미리보기) - JEP 359
  • 텍스트 블록(두 번째 미리보기) - JEP 368
  • 포장 도구(인큐베이터) - JEP 343
  • G1에 대한 NUMA 인식 메모리 할당 - JEP 345
  • JFR 이벤트 스트리밍 - JEP 349
  • 비휘발성 매핑 바이트 버퍼 - JEP 352
  • macOS의 ZGC - JEP 364
  • Windows의 ZGC - JEP 365
  • 외부 메모리 액세스 API(인큐베이터) - JEP 370

Mac OS에서 Java 14 설치 설정

  • Java 14를 시작하려면 여기에서 JDK를 다운로드하세요.
  • 아래와 같이 /Library/Java/JavaVirtualMachines에서 tar 파일을 복사하고 추출합니다.

$ cd /Library/Java/JavaVirtualMachines

$ sudo cp ~/Downloads/openjdk-14_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines

$ sudo tar xzf openjdk-14_osx-x64_bin.tar.gz

$ sudo rm openjdk-14_osx-x64_bin.tar.gz

완료되면 텍스트 편집기를 사용하여 bash_profile을 엽니다. 저는 vim ~/.bash_profile을 사용하고 있습니다. Java14의 경로를 JAVA_HOME으로 설정하고 변경 사항을 저장한 다음 source ~/.bash_profile을 수행하여 변경 사항을 반영합니다.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.jdk/Contents/Home

마지막으로 Java 14를 사용하여 프로그램을 컴파일하고 실행할 준비가 되었습니다. 새로운 Java 14 기능을 빠르게 테스트하기 위한 대화형 REPL 명령줄 도구인 JShell을 사용할 것입니다.

Java 14에서 릴리스된 많은 기능이 미리 보기 상태라는 점에 유의해야 합니다. 즉, 지금은 완벽하게 작동하지만 나중에 수정될 수 있습니다. 일부는 표준이 되거나 다음 릴리스 주기에서 간단히 제거될 수 있습니다. 미리보기 기능을 테스트하려면 아래와 같이 JShell 또는 Java 프로그램을 실행할 때 --enable-preview를 명시적으로 설정해야 합니다.

jshell --enable-preview

javac --release 14 --enable-preview Author.java

다음 몇 섹션에서는 일부 언어 및 JVM 기능에 대해 설명하겠습니다.

권장 자료: Linux에 Java 14 설치

1. 스위치 표현

지난 두 릴리스에서 미리보기 기능을 유지한 후 Switch Expressions --Java 12 및 Java 13이 마침내 Java 14에서 영구적인 상태를 얻었습니다.

  • Java 12는 스위치 표현식에 대한 람다 구문을 도입하여 패턴 일치를 위한 여러 케이스 레이블을 허용하고 장황한 코드로 이어지는 오류를 방지합니다. 또한 모든 입력 사례가 적용되지 않는 경우 컴파일 오류가 발생하는 철저한 사례를 시행했습니다.
  • 자바 13, 두 번째 미리 보기에서는 식에서 값을 반환하기 위해 break 대신 yield 문을 도입했습니다.

Java 14는 마침내 이러한 기능을 이제 표준으로 만들었습니다.

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    yield "Please insert a valid day.";
                else
                    yield "Looks like a Sunday.";
            }

        };
System.out.println(result);

참고: Yield는 Java에서 새로운 키워드가 아닙니다. 스위치 표현식에만 사용됩니다.

2. instanceof에 대한 패턴 매칭(프리뷰)

Java 개발자에게 코드베이스를 보여달라고 요청하면 코드 전체에서 instanceof 조건을 잘 사용할 수 있습니다. 특히 instanceof 조건부 검사는 일반적으로 유형 변환이 뒤따릅니다.

Java 14는 조건부 추출을 훨씬 더 간결하게 만들어 이 장황함을 제거합니다.

자바 14 이전:

if (obj instanceof Journaldev) {
  Journaldev jd = (Journaldev) obj;
  System.out.println(jd.getAuthor());
}

자바 14 이후:

if (obj instanceof Journaldev jd) {
  System.out.println(jd.getAuthor());
}

위의 코드에서 인스턴스 jdobjJournaldev 유형인 경우에만 할당됩니다. 변수의 범위는 조건부 블록으로만 제한됩니다.

3. 유용한 NullPointerExceptions

Null 포인터 예외는 모든 개발자에게 악몽입니다. 이전에는 Java 13까지 악명 높은 NPE를 디버깅하기가 까다로웠습니다. 스택 추적은 줄 번호만 표시하므로 개발자는 다른 디버깅 도구를 사용하거나 null인 변수/메소드를 수동으로 파악해야 했습니다.

자바 14 이전:

String name = jd.getBlog().getAuthor()

//Stacktrace
Exception in thread "main" java.lang.NullPointerException
    at NullPointerExample.main(NullPointerExample.java:5)

Java 14는 아래와 같이 더 설명적인 스택으로 더 나은 통찰력을 제공하는 새로운 JVM 기능을 도입했습니다.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Journaldev.getBlog()" is null
    at NullPointerExample.main(NullPointerExample.java:4)

참고: 위 기능은 언어 기능이 아닙니다. 런타임 환경의 개선 사항입니다.

4. 기록(미리보기)

레코드는 순수 데이터를 저장하는 데이터 클래스입니다. 레코드 도입의 기본 아이디어는 상용구 코드가 없는 간단하고 간결한 클래스를 빠르게 만드는 것입니다.

일반적으로 Java의 클래스는 equals(), hashCode(), 게터 및 세터 메서드를 구현해야 합니다. 일부 IDE는 이러한 클래스의 자동 생성을 지원하지만 코드는 여전히 장황합니다. 레코드를 사용하면 다음과 같은 방식으로 클래스를 정의하기만 하면 됩니다.

record Author(){}
//or
record Author (String name, String topic) {}

Java 컴파일러는 생성자, 비공개 최종 필드, 접근자, equals/hashCodetoString 메서드를 자동으로 생성합니다. 위 클래스의 자동 생성 getter 메서드는 name()topic()입니다.

생성된 코드를 살펴보려면 javap을 사용하여 프로그램을 컴파일한 후 javap Author를 사용하십시오. 다음 그림은 레코드 작성자(문자열 이름, 문자열 주제) {}에 대해 생성된 클래스를 보여줍니다.

레코드의 시맨틱은 Kotlin의 데이터 클래스와 유사합니다.

또한 다음과 같은 방법으로 추가 필드, 메서드 및 생성자를 레코드에 추가할 수 있습니다.

record Author (int id, String name, String topic) {
    static int followers;

    public static String followerCount() {
        return "Followers are "+ followers;
    }

    public String description(){
        return "Author "+ name + " writes on "+ topic;
    }

    public Author{
    if (id < 0) {
        throw new IllegalArgumentException( "id must be greater than 0.");
     }
   }
}

레코드 내부에 정의된 추가 생성자를 Compact 생성자라고 합니다. 어떤 매개변수로도 구성되지 않으며 정식 생성자의 확장일 뿐입니다.

소형 생성자는 컴파일러에서 별도의 생성자로 생성되지 않습니다. 대신 유효성 검사 사례에 사용되며 기본 생성자의 시작 부분에서 호출됩니다.

레코드에 대해 유의해야 할 몇 가지 중요한 사항:

  • 레코드는 클래스를 확장하거나 다른 클래스로 확장할 수 없습니다. 마지막 수업입니다.
  • 기록은 추상적일 수 없습니다.
  • 레코드는 다른 클래스를 확장할 수 없으며 본문 내 인스턴스 필드를 정의할 수 없습니다. 인스턴스 필드는 상태 설명에서만 정의해야 합니다.
  • 선언된 필드는 비공개이며 최종입니다.
  • 레코드 본문은 정적 필드 및 메소드를 허용합니다.

추천 도서: 자바 레코드

4.1) 레코드의 참조 필드 내부 값이 변경될 수 있음

개체로 정의된 필드의 경우 참조만 변경할 수 없다는 점에 유의해야 합니다. 기본 값은 수정할 수 있습니다. 다음 그림은 ArrayList가 수정된 레코드를 보여줍니다. 보시다시피 ArrayList가 변경될 때마다 값이 수정됩니다.

4.2) 레코드는 인터페이스를 구현할 수 있습니다.

다음 코드는 레코드가 있는 인터페이스를 구현하는 예를 보여줍니다.

record Author(String name, String topic) implements Information {
  public String getFullName() {
    return "Author "+ name + " writes on " + topic;
  }
}

interface Information {
  String getFullName();
}

다음은 JShell에서 실행 중인 위 코드의 출력입니다.

4.3) 레코드는 여러 생성자를 지원합니다.

레코드를 사용하면 아래와 같이 매개 변수가 있거나 없는 여러 생성자를 선언할 수 있습니다.

record Author(String name, String topic) {
  public Author() {

    this("NA", "NA");
  }

  public Author(String name) {

    this(name, "NA");
  }
}

4.4) 접근자 메서드 수정을 허용하는 레코드

레코드는 상태 설명에 정의된 필드에 대한 공개 접근자 메서드를 생성하지만 아래와 같이 본문에서 접근자 메서드를 재정의할 수도 있습니다.

record Author(String name, String topic) {
  public String name() {
        return "This article was written by " + this.name;
    }
}

4.5) 런타임 시 레코드 및 해당 구성 요소 확인

레코드는 isRecord()getRecordComponents()를 제공하여 클래스가 레코드인지 확인하고 해당 필드와 유형도 조사합니다. 다음 그림은 수행 방법을 보여줍니다.

위의 코드 예제에서 레코드에 추가 필드와 메서드를 추가했지만, 이 작업을 과도하게 수행하지 않도록 하십시오. 레코드는 일반 데이터 캐리어로 설계되었으며 많은 추가 메서드를 구현하려는 경우 일반 클래스로 대체하는 것이 좋습니다.

5. 텍스트 블록(미리보기)

텍스트 블록은 여러 줄 문자열 리터럴을 쉽게 생성할 수 있도록 하기 위해 Java 13의 미리 보기 기능으로 도입되었습니다. HTML 및 JSON 또는 SQL 쿼리 문자열을 쉽게 생성하는 데 유용합니다.

Java 14에서 텍스트 블록은 몇 가지 새로운 추가 기능과 함께 아직 미리 보기 상태입니다. 이제 다음을 사용할 수 있습니다.

  • 예쁜 여러 줄 문자열 블록을 표시하기 위한 백슬래시
  • \\s는 컴파일러에서 기본적으로 무시되는 후행 공백을 고려하는 데 사용됩니다. 앞에 있는 모든 공백을 유지합니다.

String text = """
                Did you know \
                Java 14 \
                has the most features among\
                all non-LTS versions so far\
                """;

String text2 = """
                line1
                line2 \s
                line3
                """;


String text3 = "line1\nline2 \nline3\n"

//text2 and text3 are equal.

참조: OpenJDK 14