1. 개요

Oracle은 이전 버전 인 버전 10 이후 6 개월 만인 2018 년 9 월에 Java 11을 출시했습니다.

Java 11은 Java 8 이후 첫 번째 LTS (장기 지원) 릴리스입니다.  Oracle도 2019 년 1 월 Java 8 지원을 중단 했습니다. 결과적으로 많은 사람들이 Java 11로 업그레이드 할 것입니다.

이 자습서에서는 Java 11 JDK를 선택하기위한 옵션을 살펴 보겠습니다. 그런 다음 Java 11에 도입 된 새로운 기능, 제거 된 기능 및 성능 향상을 살펴 보겠습니다.

2. Oracle vs. Open JDK

Java 10은 라이선스없이 상업적으로 사용할 수있는 마지막 무료 Oracle JDK 릴리스입니다. Java 11부터는 Oracle의 무료 LTS (장기 지원)가 없습니다.

고맙게도 오라클은 무료로 다운로드하여 사용할 수있는 Open JDK 릴리스를 계속 제공 하고 있습니다.

Oracle 외에도 고려할 수 있는 다른 Open JDK 공급자 가 있습니다.

3. 개발자 기능

공통 API의 변경 사항과 개발자에게 유용한 몇 가지 다른 기능을 살펴 보겠습니다.

3.1. 새로운 문자열 메서드

Java 11은 몇 가지 새로운 메소드String 클래스에 추가합니다 . isBlank , lines , strip , stripLeading , stripTrailingrepeat .

새 메서드를 사용하여 여러 줄 문자열에서 공백이 아닌 제거 된 줄을 추출하는 방법을 확인해 보겠습니다.

String multilineString = "Baeldung helps \n \n developers \n explore Java.";
List<String> lines = multilineString.lines()
  .filter(line -> !line.isBlank())
  .map(String::strip)
  .collect(Collectors.toList());
assertThat(lines).containsExactly("Baeldung helps", "developers", "explore Java.");

이러한 메서드는 문자열 개체를 조작하는 데 필요한 상용구의 양을 줄이고 라이브러리를 가져 오지 않아도됩니다.

스트립 방법 의 경우 더 익숙한 트림 방법 과 유사한 기능을 제공합니다 . 그러나 더 세밀한 제어와 유니 코드 지원이 있습니다.

3.2. 새 파일 방법

이제 파일에서 String 을 읽고 쓰는 것이 더 쉬워졌습니다 .

Files 클래스 에서 새로운 readStringwriteString 정적 메서드를 사용할 수 있습니다 .

Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");

3.3. 배열로 수집

java.util.Collection으로의 인터페이스는 새로운 기본 포함 toArray의 걸리는 방법 IntFunction의 인수를.

이렇게하면 컬렉션에서 올바른 유형의 배열을 더 쉽게 만들 수 있습니다.

List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");

3.4. Not 술어 메소드

Predicate 인터페이스에 정적 not 메소드 가 추가되었습니다 . negate 메소드 와 같이 기존 술어를 부정하는 데 사용할 수 있습니다 .

List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
List withoutBlanks = sampleList.stream()
  .filter(Predicate.not(String::isBlank))
  .collect(Collectors.toList());
assertThat(withoutBlanks).containsExactly("Java", "Kotlin");

not (isBlank)isBlank .negate () 보다 더 자연스럽게 읽는 반면 , 큰 장점은 not (String : isBlank) 와 같은 메소드 참조와 함께 not사용할 수도 있다는 것 입니다.

3.5. Lambda에 대한 지역 변수 구문

람다 매개 변수 에서 지역 변수 구문 ( var 키워드) 사용에 대한 지원 이 Java 11에 추가되었습니다.

이 기능을 사용하여 타입 어노테이션 정의와 같이 지역 변수에 수정자를 적용 할 수 있습니다.

List<String> sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
  .map((@Nonnull var x) -> x.toUpperCase())
  .collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");

3.6. HTTP 클라이언트

새로운 HTTP 클라이언트 로부터 java.net.http의 패키지는 자바 (9)에 도입 된 지금은 자바 (11)의 표준 기능이되고있다.

새로운 HTTP API는 전반적인 성능을 향상시키고 HTTP / 1.1 및 HTTP / 2를 모두 지원합니다.

HttpClient httpClient = HttpClient.newBuilder()
  .version(HttpClient.Version.HTTP_2)
  .connectTimeout(Duration.ofSeconds(20))
  .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
  .GET()
  .uri(URI.create("http://localhost:" + port))
  .build();
HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
assertThat(httpResponse.body()).isEqualTo("Hello from the server!");

3.7. Nest 기반 액세스 제어

Java 11 은 JVM 내에서 Nestmate 및 관련 액세스 규칙 의 개념을 도입합니다 .

Java의 클래스 중첩은 외부 / 기본 클래스와 모든 중첩 클래스를 모두 의미합니다.

assertThat(MainClass.class.isNestmateOf(MainClass.NestedClass.class)).isTrue();

중첩 클래스는 NestMembers 특성에 연결되고 외부 클래스는 NestHost 특성에 연결됩니다  .

assertThat(MainClass.NestedClass.class.getNestHost()).isEqualTo(MainClass.class);

JVM 액세스 규칙은 네스트 메이트 간의 개인 멤버에 대한 액세스를 허용합니다. 그러나 이전 Java 버전에서는 리플렉션 API 가 동일한 액세스를 거부했습니다.

Java 11은이 문제를 수정하고 리플렉션 API를 사용하여 새 클래스 파일 속성을 쿼리하는 방법을 제공합니다.

Set<String> nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers())
  .map(Class::getName)
  .collect(Collectors.toSet());
assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());

3.8. Java 파일 실행

이 버전의 주요 변경 사항은 더 이상 명시 적으로 javac로 Java 소스 파일을 컴파일 할 필요가 없다는 것입니다 .

$ javac HelloWorld.java
$ java HelloWorld 
Hello Java 8!

대신 java  명령을 사용하여 파일직접 실행할있습니다 .

$ java HelloWorld.java
Hello Java 11!

4. 성능 향상

이제 주요 목적이 성능 향상 인 몇 가지 새로운 기능을 살펴 보겠습니다.

4.1. 동적 클래스 파일 상수

Java 클래스 파일 형식은 CONSTANT_Dynamic 이라는 새로운 상수 풀 형식을 지원하도록 확장되었습니다 .

새 상수 풀을로드하면 invokedynamic  호출 사이트를 연결하는 것이 연결을 부트 스트랩 메서드에 위임 하는 것처럼 생성을 부트 스트랩 메서드에 위임합니다.

이 기능은 성능을 향상시키고 언어 디자이너와 컴파일러 구현자를 대상으로합니다.

4.2. 개선 된 Aarch64 내장 함수

Java 11은 ARM64 또는 AArch64 프로세서에서 기존 문자열 및 배열 내장 함수를 최적화합니다. 또한 java.lang.Math의 sin, coslog 메소드에 대한 새로운 내장 함수가 구현되었습니다 .

우리는 다른 것과 마찬가지로 내장 함수를 사용합니다. 그러나 내장 함수는 컴파일러에 의해 특별한 방식으로 처리됩니다. CPU 아키텍처 별 어셈블리 코드를 활용하여 성능을 향상시킵니다.

4.3. 작동 하지 않는 가비지 수집기

Epsilon이라는 새로운 가비지 수집기는 Java 11에서 실험적 기능으로 사용할 수 있습니다.

메모리를 할당하지만 실제로 쓰레기를 수집하지 않기 때문에 No-Op (작업 없음)라고합니다. 따라서 Epsilon은 메모리 부족 오류를 시뮬레이션하는 데 적용 할 수 있습니다.

분명히 Epsilon은 일반적인 프로덕션 Java 애플리케이션에는 적합하지 않습니다. 그러나 유용 할 수있는 몇 가지 특정 사용 사례가 있습니다.

  • 성능 시험
  • 메모리 압력 테스트
  • VM 인터페이스 테스트 및
  • 수명이 매우 짧은 작업

활성화하려면 -XX : + UnlockExperimentalVMOptions -XX : + UseEpsilonGC  플래그를 사용하십시오.

4.4. 비행 레코더

JFR ( Java Flight Recorder )은 이제 Oracle JDK에서 상용 제품이었던 Open JDK의 오픈 소스입니다 . JFR은 실행중인 Java 애플리케이션에서 진단 및 프로파일 링 데이터를 수집하는 데 사용할 수있는 프로파일 링 도구입니다.

120 초 JFR 기록을 시작하려면 다음 매개 변수를 사용할 수 있습니다.

-XX:StartFlightRecording=duration=120s,settings=profile,filename=java-demo-app.jfr

성능 오버 헤드가 일반적으로 1 % 미만이므로 프로덕션에서 JFR을 사용할 수 있습니다. 시간이 지나면 JFR 파일에 저장된 기록 데이터에 액세스 할 수 있습니다.

그러나 데이터를 분석하고 시각화하려면 JMC ( JDK Mission Control) 라는 다른 도구를 사용해야 합니다.

5. 제거 및 사용되지 않는 모듈

Java가 발전함에 따라 제거 된 기능을 더 이상 사용할 수 없으며 더 이상 사용되지 않는 기능의 사용을 중지해야합니다. 가장 주목할만한 것들을 간단히 살펴 보겠습니다.

5.1. Java EE 및 CORBA

Java EE 기술의 독립형 버전은 타사 사이트에서 사용할 수 있습니다. 따라서 Java SE에이를 포함 할 필요가 없습니다.

Java 9는 이미 선택된 Java EE 및 CORBA 모듈을 사용하지 않습니다. 릴리스 11에서는 이제 완전히 제거되었습니다.

  • XML 기반 웹 서비스 용 Java API (java.xml.ws )
  • XML 바인딩을위한 Java 아키텍처 (java.xml.bind )
  • JavaBeans Activation Framework (java.activation )
  • 공통 어노테이션 (java.xml.ws.annotation )
  • 공통 객체 요청 브로커 아키텍처 (java.corba)
  • JavaTransaction API (java.transaction )

5.2. JMC 및 JavaFX

JMC ( JDK Mission Control )는 더 이상 JDK에 포함되지 않습니다. 이제 독립형 버전의 JMC를 별도의 다운로드로 사용할 수 있습니다.

JavaFX 모듈도 마찬가지입니다 . JavaFX는 JDK 외부에서 별도의 모듈 세트로 사용할 수 있습니다.

5.3. 사용되지 않는 모듈

또한 Java 11은 다음 모듈을 더 이상 사용하지 않습니다.

  • JJS 도구를 포함한 Nashorn JavaScript 엔진
  • JAR 파일에 대한 Pack200 압축 체계

6. 기타 변경 사항

Java 11은 언급해야 할 몇 가지 추가 변경 사항을 도입했습니다.

  • 새로운 ChaCha20 및 ChaCha20-Poly1305 암호 구현은 안전하지 않은 RC4 스트림 암호를 대체합니다.
  • 기존 ECDH 체계를 대체하는 Curve25519 및 Curve448과의 암호화 키 계약 지원
  • TLS (전송 계층 Security)를 버전 1.3으로 업그레이드하여 Security 및 성능 향상
  • 일시 중지 시간이 짧은 실험 기능으로 지연 시간이 짧은 가비지 수집기 ZGC를 도입했습니다.
  • 유니 코드 10 지원으로 더 많은 문자, 기호 및 이모 지 제공

7. 결론

이 기사에서는 Java 11의 몇 가지 새로운 기능을 살펴 보았습니다.

Oracle과 Open JDK의 차이점을 다루었습니다. 또한 API 변경 사항, 기타 유용한 개발 기능, 성능 향상 및 제거되거나 사용되지 않는 모듈을 검토했습니다.

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