JavaRush /Java Blog /Random-KO /Java 11 출시: 새로운 기능

Java 11 출시: 새로운 기능

Random-KO 그룹에 게시되었습니다
이전에는 새로운 버전의 Java가 거의 출시되지 않았으며 지연되었습니다. 이제 오라클은 "6개월마다 새로운 Java"라는 자체 설정 리듬을 성공적으로 유지하고 있습니다. 그래서 며칠 전, 엄격하게 일정에 맞춰 마침내 Java SE 11 과 JDK (Java Development Kit) 구현을 받았습니다. Java 11 출시: 새로운 기능 및 기능 - 1늘 그렇듯이 새 버전은 이전 버전과 호환되며 Java 11에 대한 지원은 2026년 12월 이전에 종료됩니다.

Java SE 11의 새로운 기능(개발자에게 표시)

Java에서는 JEP “JDK Enhancement Proposal” 구현을 통해 변경이 이루어집니다. JEP 는 OpenJDK를 개선하기 위한 제안이며 승인, 지연 또는 거부될 수 있습니다. 즉, 본질적으로 JEP 모음은 OpenJDK의 개발 전략입니다. 새로운 "기능" 앞의 대괄호 안에 해당 JEP의 번호가 표시됩니다. 람다 매개변수에 대한 지역 변수 구문 - 람다 매개변수에 대한 var 구문 Java 10에서는 var 키워드를 도입하여 지역 변수의 유형을 명시적으로 지정하지 않는 것이 가능해졌습니다. 이로 인해 코드가 단순화되었습니다. JEP 323은 람다 표현식을 통해 이 구문의 사용을 확장합니다. 간단한 예:
list.stream ()
                 .map ((var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
유명한 Java 전도사인 Simon Ritter가 쓴 것처럼 숙련된 Java 프로그래머는 위의 코드를 다음으로 대체할 수 있으므로 이 경우 var를 사용하는 것이 불필요할 수 있다는 점을 지적할 것입니다.
list.stream ()
                  .map (s -> s.toLowerCase ())
                  .collect (Collectors.toList ());
그렇다면 왜 var를 지원합니까? 람다 매개변수에 주석을 추가하려는 특별한 경우가 하나 있습니다. 이는 일부 유형이 포함되지 않고는 수행될 수 없으며 명시적인 유형을 사용하지 않으려면 다음과 같이 var를 사용하여 모든 것을 단순화할 수 있습니다.
list.stream ()
                 .map ((@ Notnull var s) -> s.toLowerCase ())
                 .collect (Collectors.toList ());
단일 파일 소스 코드 프로그램 실행 Java 소스 코드가 포함된 단일 파일로 프로그램을 실행하도록 Java 실행 프로그램 향상 Java는 장황한 구문과 사소한 응용 프로그램을 실행하는 다단계 "의식"으로 인해 종종 비판을 받습니다. 때때로 이것은 초보자를 두려워합니다. 간단히 " Hello World! "를 인쇄하는 애플리케이션을 작성하려면 "를 사용하려면 공개 정적 void기본 메서드를 사용하여 클래스를 작성하고 System.out.println. 이 작업을 완료한 후에는 javac 를 사용하여 코드를 컴파일해야 합니다 . 마지막으로, 불운한 인사말을 표시하는 애플리케이션을 시작할 수 있습니다(물론 IDEA 와 JavaRush 에 내장된 통합 개발 환경 은 이 "앱 실행 마법"을 자체적으로 수행합니다. - 편집자 주 ). 솔직히 말해서 대부분의 프로그래밍 언어에서 프로그램을 실행하기 위한 실제 스크립트는 훨씬 더 단순해 보입니다. JEP 330에서는 단일 파일 애플리케이션을 컴파일할 필요가 없으므로 이제 명령줄을 사용하는 경우 다음을 입력하면 됩니다.
java HelloWorld.java
Java 실행 프로그램은 파일에 Java 소스 코드가 포함되어 있음을 감지하고 코드를 실행하기 전에 클래스 파일로 컴파일합니다. 소스 코드 파일 이름 뒤나 앞에 매개변수를 배치할 수 있습니다. 이름 뒤에 오는 것들은 애플리케이션이 실행될 때 매개변수로 전달됩니다. 이름 앞에 배치된 항목은 코드가 컴파일된 후 Java 실행 프로그램에 매개변수로 전달됩니다. 컴파일러별 옵션(예: 클래스 경로)도 컴파일을 위해 javac 에 전달됩니다 . 예. 선:
java -classpath / home / foo / java Hello.java Bonjour
다음 줄과 동일합니다.
javac -classpath / home / foo / java Hello.java
java -classpath / home / foo / java Hello Bonjour
HTTP 클라이언트(표준) - HTTP 클라이언트 API 지원이 표준화되었으며, JDK 9에서는 HTTP 클라이언트 프로토콜(JEP 110)을 지원하기 위한 새로운 API가 도입되었습니다 . JDK 9에서는 JPMS(Java Platform Module System) 도 도입했기 때문에 이 API는 인큐베이터 모듈 로 포함되었습니다 . 제거 준비 - 개발자는 새로운 API를 시험해보고 피드백을 제공할 수 있습니다. 필요한 변경이 이루어지면(이 API는 JDK 10에서 업데이트됨) API가 표준의 일부가 될 수 있습니다. 따라서 HTTP 클라이언트 API는 이제 Java SE 11에 공식적으로 포함되었습니다 . 여기에는 JDK 용 새 모듈과 패키지인 java.net.http가 도입되었습니다 . 새로운 주요 유형은 다음과 같습니다. HttpClient HttpRequest HttpResponse WebSocket 이 API는 동기식 또는 비동기식으로 사용할 수 있습니다. 비동기 모드에서는 및 가 사용됩니다 . Java EE 및 CORBA 모듈 제거 Java 9번째 버전에 JPMS(Java Platform Module System)가 도입되면서 모놀리식 rt.jar 파일을 여러 모듈로 분할하는 것이 가능해졌습니다 . 또한 JPMS를 사용하면 애플리케이션에 필요한 모듈만 포함하는 Java 런타임 환경을 생성하여 크기를 크게 줄일 수 있습니다. 투명하게 정의된 모듈 경계를 사용하면 Java API의 오래된 부분을 제거하는 것이 훨씬 쉽습니다(JEP 320이 수행하는 작업). java.se.ee 메타 모듈 에는 Java SE 11 표준의 일부가 아니며 포함되지 않는 6개의 모듈이 포함되어 있습니다. JDK에서: CompletionFuturesCompletionStages
  • 코르바
  • 거래
  • 활성화
  • xml.bind
  • xml.ws
  • xml.ws.annotation
이러한 모듈은 JDK 9에서 더 이상 사용되지 않으며 컴파일이나 실행에 기본적으로 포함되지 않았습니다. 이는 JDK 9 또는 JDK 10에서 이러한 모듈의 API를 사용하는 애플리케이션을 컴파일하거나 실행하려고 하면 실패했음을 의미합니다. 코드에서 이러한 모듈의 API를 사용하는 경우 이를 별도의 모듈이나 라이브러리로 제공해야 합니다.

새로운 API

언어 표준에 HTTP 클라이언트Flight Recorder 모듈 이 포함된 덕분에 JDK 11에는 수많은 새로운 API가 등장했습니다 . 전체 API 목록을 보려면 Gunnar Morling이 편집한 다양한 JDK 버전의 다음 종합 비교를 참조하세요 . 그리고 이 노트에서는 java.net.http , jdk.jfrjava.security 모듈 에 포함되지 않은 몇 가지 새로운 메소드를 나열할 것입니다 . java.lang.String JDK 11 API의 String에 대한 가장 중요한 변경 사항 중 하나 는 몇 가지 유용한 새 메서드입니다.
  • boolean isBlank (): 문자열이 비어 있거나 공백만 포함되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

  • Stream lines(): 이 문자열에서 추출된 줄 스트림을 줄 종결자로 구분하여 반환합니다.

  • String repeat (int): int 번 반복된 문자열을 연결한 값을 갖는 문자열을 반환합니다 .

  • String strip (): 공백이 아닌 첫 번째 문자 앞이나 뒤의 모든 공백이 제거된 문자열을 반환합니다.

  • String stripLeading (): 공백이 아닌 첫 번째 문자까지 모든 공백이 제거된 문자열을 반환합니다.

  • String stripTrainling (): 공백이 아닌 마지막 문자가 제거된 이후에 발생하는 모든 공백이 포함된 문자열을 반환합니다.
strip()이 메소드는 이미 비슷한 작업을 수행했지만 trim ()공백으로 인해 이러한 메소드는 다른 의미를 갖습니다. 경우에는 trim()공백만 잘리고 strip()- 탭 등 특수문자도 잘립니다. java.lang.StringBuffer java.lang.StringBuilder 이들 클래스는 모두 /를 compareTo ()받아들이고 를 반환하는 새로운 메소드를 포함합니다 . 어휘 비교 방법은 새로운 방법과 유사합니다 . java.io.ByteArrayOutputStreamStringBufferStringBuilderintcompareTo() CharSequence
  • void writeBytes (byte []): 매개변수의 모든 바이트를 java.io.FileReader 출력 스트림에 씁니다.
여기에는 를 지정할 수 있는 두 개의 새로운 생성자가 있습니다 Charset. java.io.FileWriter t를 지정할 수 있는 4개의 새로운 생성자 Charse. java.io.InputStream
  • io.InputStream nullInputStream (): 를 반환하며 InputStream, 이는 바이트를 읽지 않습니다. 이 방법을 사용하는 방법은 무엇입니까? 필요하지 않은 출력을 버리거나 항상 0바이트를 반환하는 입력을 삽입하기 위해 /dev/null과 같은 것으로 생각할 수 있습니다.
java.io.OutputStream
  • io.OutputStream nullOutputStream ()
java.io.리더
  • io.Reader nullReader ()
java.io.작가
  • io.Writer nullWriter ()
java.lang.문자
  • String toString (int): 기존 메소드의 오버로드이지만 char 대신 int를 사용합니다.
java.lang.CharSequence
  • int compare (CharSequence, CharSequence): 두 인스턴스를 사전순으로 비교합니다 CharSequence. 첫 번째 시퀀스가 ​​사전순으로 두 번째 시퀀스보다 각각 작거나 같거나 큰 경우 음수 값, 0 또는 양수 값을 반환합니다.
java.lang.ref.참조
    lang.Object clone (): Java 전도사 Simon Ritter는 이 방법이 그를 혼란스럽게 한다고 인정합니다. 클래스는 Reference인터페이스를 구현하지 않으며 Cloneable이 메소드는 항상 예외를 발생시킵니다 CloneNotSupportedException. 그러나 전문가는 이 방법이 미래에는 어떤 일에 유용할 것이라고 제안한다.
java.lang.Runtime java.lang.System 여기에는 새로운 메소드가 없습니다. 이 두 클래스 모두에서 메서드가 runFinalizersOnExit ()제거되어 호환성 문제가 발생할 수 있다는 점만 언급하겠습니다. java.lang.Threaddestroy () 추가 메소드는 없습니다. 제거 되었다는 것만 언급하겠습니다 stop (Throwable). 그러나 stop ()인수를 사용하지 않는 는 계속 사용할 수 있습니다. 호환성 문제가 있을 수 있으므로 이 점을 염두에 두시기 바랍니다. java.nio.ByteBuffer java.nio.CharBuffer java.nio.DoubleBuffer java.nio.FloatBuffer java.nio.LongBuffer java.nio.ShortBuffer 이 모든 클래스에서 언어 개발자는 mismatch ()클래스의 상대 인덱스를 찾아 반환하는 메서드를 추가했습니다. 이 버퍼와 지정된 버퍼 간의 첫 번째 불일치. java.nio.channels.SelectionKey
  • int interestOpsAnd (int)

  • int interestOpsOr (int)
java.nio.channels.Selector
  • int select (java.util.function.Consumer, long): 해당 채널이 I/O 작업 준비가 된 키에 대한 작업을 선택하고 실행합니다. 긴 매개변수는 시간 초과입니다.

  • int select (java.util.function.Consumer): 위의 방법과 동일하게 작동하지만 시간 초과가 없습니다.

  • int selectNow (java.util.function.Consumer): 위의 방법과 동일하게 작동하지만 단지 비차단 방식입니다.

java.nio.file.파일
  • String readString (Path): 파일의 모든 콘텐츠를 문자열로 읽어 UTF-8 인코딩을 사용하여 바이트를 문자로 디코딩합니다 .

  • String readString (Path, Charset): 위의 방법과 동일하게 작동하지만 를 사용하여 바이트를 문자로 디코딩합니다 Charset.

  • Path writeString (Path, CharSequence, java.nio.file. OpenOption []): 파일에 일련의 문자를 쓰면 CharSequence해당 문자는 바이트로 인코딩됩니다( UTF-8 사용 ).

  • Path writeString (Path, CharSequence, java.nio.file. Charset, OpenOption []): 위의 방법과 같이 작동하며 를 사용하여 문자만 바이트로 인코딩됩니다 Charset.
java.nio.file.Path
  • Path(String, String[]): 경로 문자열 또는 결합되어 경로 문자열을 형성하는 문자열 시퀀스를 변환하여 경로를 반환합니다.

  • 경로(net.URI): URI를 변환하여 경로를 반환합니다.
java.util.Collection
  • Object [] toArray (java.util.function.IntFunction): 반환된 배열을 배포하기 위해 제공된 생성기 함수를 사용하여 이 컬렉션의 모든 요소를 ​​포함하는 배열을 반환합니다.
java.util.concurrent.PriorityBlockingQueue java.util.PriorityQueue
  • void forEach (java.util.function.Consumer): 모든 요소가 처리되거나 작업에서 예외가 발생할 때까지 각 Iterable 요소 에 대해 지정된 작업을 수행합니다 .

  • boolean removeAll (java.util.Collection): 지정된 컬렉션에도 포함되어 있는 이 컬렉션의 모든 요소를 ​​제거합니다(선택적 작업).

  • boolean removeIf (java.util.function.Predicate): 주어진 조건을 만족하는 이 컬렉션의 모든 요소를 ​​제거합니다.

  • boolean retainAll (java.util.Collection): 지정된 컬렉션에 포함된 이 컬렉션의 요소만 보존합니다(선택적 작업).
java.util.concurrent.TimeUnit
  • long convert (java.time.Duration): 주어진 시간을 이 단위로 환산합니다.
java.util.function.Predicate
  • Predicate not(Predicate): 주어진 술어의 부정인 술어를 반환합니다.
예를 들어 다음 코드는 다음과 같습니다.
lines.stream ()

.filter (s ->! s.isBlank ())
다음과 같이 변환할 수 있습니다.
lines.stream ()

.filter (Predicate.not (String :: ISBLANK))
그리고 정적 가져오기를 사용하면 다음과 같은 결과를 얻을 수 있습니다.
lines.stream ()
.filter (not(String :: ISBLANK))
java.util.Optional java.util.OptionalInt java.util.OptionalDouble java.util.OptionalLong
  • boolean isEmpty (): 값이 없으면 true를 반환하고, 그렇지 않으면 false를 반환합니다 .
java.util.regex.Pattern
  • Predicate asMatchPredicate (): Java 전문가 Simon Ritter는 여기에 실제 JDK 11 API gem이 숨겨져 있을 수 있다고 믿습니다. 이 메소드는 이 패턴이 주어진 입력 문자열과 일치하는지 확인하는 조건자를 생성합니다.
java.util.zip.디플레이터
  • int deflate (ByteBuffer): 입력 데이터를 압축하고 지정된 버퍼를 압축된 데이터로 채웁니다.

  • int deflate (ByteBuffer, int): 입력 데이터를 압축하고 지정된 버퍼를 압축된 데이터로 채웁니다. 압축된 데이터의 실제 양을 반환합니다.

  • void setDictionary (ByteBuffer): 주어진 버퍼에서 주어진 사전을 바이트로 압축하도록 설정합니다. ByteBuffer이는 이제 바이트 배열이 아닌 을 허용할 수 있는 기존 메서드의 오버로드입니다 .

  • void setInput (ByteBuffer): 입력 데이터를 압축하도록 설정합니다. 또한 기존 메서드의 오버로드이기도 합니다.
java.util.zip.인플레이터
  • int inflate (ByteBuffer): 바이트를 지정된 버퍼에 압축 해제합니다. 압축되지 않은 실제 바이트 수를 반환합니다.

  • void setDictionary (ByteBuffer): 주어진 사전을 주어진 버퍼의 바이트로 설정합니다. 기존 메소드의 오버로드된 형태입니다.

  • void setInput (ByteBuffer): 압축해제를 위한 입력 데이터를 설정합니다. 기존 메서드의 오버로드된 형태입니다.
javax.print.attribute.standard.DialogOwner JDK 11의 새로운 클래스로 모든 창 또는 특정 창 위에 표시되도록 인쇄 또는 사용자 정의 페이지 요청을 지원하는 데 사용되는 속성 클래스입니다. javax.swing.DefaultComboBoxModel javax.swing.DefaultListModel
  • void addAll (Collection): 컬렉션에 있는 모든 요소를 ​​추가합니다.

  • void addAll (int, Collection): 지정된 인덱스에서 시작하여 컬렉션에 있는 모든 요소를 ​​추가합니다.
javax.swing.ListSelectionModel
  • int [] getSelectedIndices (): 선택된 모델에서 선택된 모든 인덱스의 배열을 오름차순으로 반환합니다.

  • int getSelectedItemsCount (): 선택한 항목의 개수를 반환합니다.
jdk.jshell.EvalException
  • shell.JShellException getCause (): 이 EvalException에 의해 제공된 실행 클라이언트에서 발생 가능한 이유를 반환하거나, 이유가 존재하지 않거나 알 수 없는 경우 null을 반환합니다.

Java 11의 비개발자 기능

Nest 기반 접근 제어 Java 및 기타 언어는 내부 클래스를 통해 중첩 클래스를 지원합니다. 이것이 작동하려면 컴파일러가 특정 트릭을 수행해야 합니다. 예를 들어:
public class Outer {
    private int outerInt;

     class Inner {
       public void printOuterInt() {
         System.out.println("Outer int = " + outerInt);
       }
     }
   }
컴파일러는 컴파일하기 전에 이를 수정하여 다음과 같은 결과를 생성합니다.
public class Outer {
      private int outerInt;

      public int access$000() {
        return outerInt;
      }

    }


    class Inner$Outer {

      Outer outer;

      public void printOuterInt() {
        System.out.println("Outer int = " + outer.access$000());
      }
    }
논리적으로 내부 클래스는 외부 클래스와 동일한 코드의 일부이지만 별도의 클래스로 컴파일됩니다. 따라서 이 작업에는 외부 클래스의 전용 필드 에 대한 액세스를 제공하기 위해 컴파일러에서 생성해야 하는 합성 조인 메서드가 필요합니다 . 이 JEP는 동일한 둥지의 두 멤버(이 예에서는 외부 및 내부)가 중첩 친구인 둥지 개념을 소개합니다. 클래스 파일 형식에 대해 NestHostNestMembers 라는 두 가지 새로운 속성이 정의되었습니다 . 이러한 변경 사항은 중첩 클래스와 바이트코드를 지원하는 다른 언어에 유용합니다. 이 함수는 java.lang.Class 에 대한 세 가지 새로운 메소드를 소개합니다 . Class getNestHost () Class [] getNestMembers () boolean isNestmateOf (Class) [309] 동적 클래스 파일 상수 이 JEP는 새로운 클래스를 지원하기 위한 클래스 파일 형식의 확장을 설명합니다. 영구 풀 형식 CONSTANT_Dynamic. 동적 상수라는 개념은 모순처럼 보이지만 본질적으로 Java 11의 최종 값이라고 생각하면 됩니다. 풀링 상수의 값은 (다른 상수와 달리) 컴파일 타임에 설정되지 않지만 부트스트랩을 사용합니다. 리드 타임에 값을 결정하는 방법. 따라서 값은 동적이지만 값은 한 번만 설정되므로 일정합니다. 이 기능은 주로 JVM에서 실행할 출력으로 바이트코드와 클래스 파일을 생성하는 새로운 언어와 컴파일러를 개발하는 사람들을 대상으로 합니다. Aarch64 내장 기능 개선 이 JEP는 Red Hat 커뮤니티에서 제안되었습니다. 이제 JVM은 Arm 64 명령어 세트에서 사용할 수 있는 보다 특수한 명령어를 사용할 수 있으며, 특히 이를 통해 , 메소드 sin ()java.lang.Mathcos () 클래스 log ()의 성능이 향상됩니다 . Epsilon: 무작동 가비지 컬렉터 JEP 315 와 마찬가지로 Epsilon 가비지 컬렉터 도입에 대해 Red Hat에 감사드립니다. Epsilon은 실제로 쓰레기를 수집하지 않는다는 점에서 특이합니다! 새 객체를 생성할 때 필요한 경우 메모리를 할당하지만 등록되지 않은 객체가 차지하는 공간을 회수하지는 않습니다. " 점은 무엇인가? ", - 물어. 이 "가비지 수집"에는 두 가지 용도가 있는 것으로 나타났습니다.
  1. 우선, 이 가비지 수집기는 성능 영향 측면에서 새로운 GC 알고리즘을 평가하도록 설계되었습니다. 아이디어는 Epsilon으로 샘플 애플리케이션을 실행하고 일련의 측정항목을 생성하는 것입니다. 새로운 가비지 수집 알고리즘이 활성화되고 동일한 테스트가 실행된 후 결과가 비교됩니다.

  2. 힙에 할당된 메모리를 초과하지 않도록 보장할 수 있는 매우 짧은 작업(클라우드의 서버리스 기능을 생각해 보세요)의 경우. 이는 애플리케이션 코드에서 오버헤드(컬렉터 실행 여부를 결정하는 데 필요한 통계 수집 포함)를 제거하여 성능을 향상시킬 수 있습니다. 힙 공간이 모두 소모되면 JVM은 다음 세 가지 방법 중 하나로 잘못 구성될 수 있습니다.
    • 보통은 이라고 합니다 OutOfMemoryError.
    • 힙 재설정 수행
    • JVM 하드 드라이브에 오류가 발생하여 다른 작업(예: 디버거 시작)을 수행 중일 수 있습니다.
[328]: Flight Recorder Flight Recorder 는 JVM용 하위 수준 데이터 수집 프레임워크입니다. JDK 11 이전에는 이는 Oracle JDK 바이너리의 상용 기능이었습니다. Oracle은 이제 Oracle JDK와 OpenJDK의 한 빌드 간의 기능적 차이를 제거하고 있습니다. Flight Recorder의 기능은 다음과 같습니다 .
  • 데이터를 이벤트로 생성하고 소비하기 위한 API 제공
  • 버퍼 메커니즘 및 바이너리 데이터 형식 제공
  • 이벤트의 사용자 정의 및 필터링이 가능합니다.
  • OS, JVM HotSpot 및 JDK 라이브러리에 대한 이벤트 제공
여기에는 jdk.jfrjdk.management.jfr 이라는 두 가지 새로운 모듈이 있습니다 . ChaCha20 및 Poly1305 암호화 알고리즘JEP는 JDK에서 사용하는 암호화 업데이트에 관한 것입니다 . 이 사례에서는 RFC 7539에 지정된 대로 ChaCha20ChaCha20-Poly1305 암호화 알고리즘을 구현합니다. ChaCha20은 이전의 안전하지 않은 RC4 암호 를 대체할 수 있는 비교적 새로운 스트림 암호입니다 . ZGC: 확장 가능한 저지연 가비지 수집기 실험적인 확장 가능한 저지연 가비지 수집기입니다. 대용량(멀티기가바이트) 힙과 낮은 대기 시간이 필요한 애플리케이션과 함께 사용하도록 설계되었습니다. 이는 단일 세대 힙을 사용하며 애플리케이션과 동시에 가비지 수집 작업의 대부분(전부는 아님)을 수행합니다. TLS(전송 계층 보안) 1.3 TLS 1.3(RFC 8446)은 이전 버전에 비해 상당한 보안 및 성능 향상을 제공하는 TLS 전송 계층 보안 프로토콜의 주요 패치입니다. JDK는 이제 이 프로토콜 버전을 지원합니다. 이 자료는 Simon Ritter 의 기사 와 공식 문서를 기반으로 합니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION