1. 소개

Java SE 10을 구현 한 JDK 10 은 2018 년 3 월 20 일에 출시되었습니다.

이 기사에서는 JDK 10에 도입 된 새로운 기능과 변경 사항을 다루고 탐색합니다.

2. 지역 변수 유형 추론

이 기능에 대한 자세한 기사를 보려면 링크를 따르십시오.

자바 10 지역 변수 유형 추론

3. 수정할 수없는 컬렉션

Java 10의 수정 불가능한 컬렉션과 관련된 몇 가지 변경 사항이 있습니다.

3.1. copyOf()

java.util.List , java.util.Map java.util.Set  각각은 새로운 정적 메소드 copyOf (Collection)을 얻었습니다 .

주어진 Collection 의 수정 불가능한 복사본을 반환합니다 .

@Test(expected = UnsupportedOperationException.class)
public void whenModifyCopyOfList_thenThrowsException() {
    List<Integer> copyList = List.copyOf(someIntList);
    copyList.add(4);
}

이러한 컬렉션을 수정하려고하면 java.lang.UnsupportedOperationException 런타임 예외가 발생합니다.

3.2. toUnmodifiable * ()

java.util.stream.Collectors Stream  을 수정 불가능한 List , Map  또는 Set 으로 수집하는 추가 메소드를 가져옵니다 .

@Test(expected = UnsupportedOperationException.class)
public void whenModifyToUnmodifiableList_thenThrowsException() {
    List<Integer> evenList = someIntList.stream()
      .filter(i -> i % 2 == 0)
      .collect(Collectors.toUnmodifiableList());
    evenList.add(4);
}

이러한 컬렉션을 수정하려고하면 java.lang.UnsupportedOperationException 런타임 예외가 발생합니다.

4. 선택 사항 * .orElseThrow ()

java.util.Optional , java.util.OptionalDouble , java.util.OptionalIntjava.util.OptionalLong은 각각 인수를 취하지 않고 값이없는 경우 NoSuchElementException을 던지는 새 메소드 또는 ElseThrow ()얻었습니다 .

@Test
public void whenListContainsInteger_OrElseThrowReturnsInteger() {
    Integer firstEven = someIntList.stream()
      .filter(i -> i % 2 == 0)
      .findFirst()
      .orElseThrow();
    is(firstEven).equals(Integer.valueOf(2));
}

이는 기존 get () 메소드 와 동의어이며 이제는 기존 get () 메소드에 대한 선호되는 대안 입니다.

5. 성능 향상

이 기능에 대한 자세한 기사를 보려면 링크를 따르십시오.

Java 10 성능 향상

6. 컨테이너 인식

JVM은 이제 Docker 컨테이너에서 실행되고 있음을 인식  하고 운영 체제 자체를 쿼리하는 대신 컨테이너 별 구성을 추출합니다. 이는 컨테이너에 할당 된 CPU 수 및 총 메모리와 같은 데이터에 적용됩니다.

그러나이 지원은 Linux 기반 플랫폼에서만 사용할 수 있습니다. 이 새로운 지원은 기본적으로 활성화되며 JVM 옵션을 사용하여 명령 줄에서 비활성화 할 수 있습니다.

-XX:-UseContainerSupport

또한이 변경은 JVM이 사용할 CPU 수를 지정하는 기능을 제공하는 JVM 옵션을 추가합니다.

-XX:ActiveProcessorCount=count

또한 Docker 컨테이너 사용자가 Java 힙에 사용될 시스템 메모리 양을보다 세밀하게 제어 할 수 있도록 세 가지 새로운 JVM 옵션이 추가되었습니다.

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

7. 루트 인증서

지금까지 처음에 비어 있던 cacerts 키 저장소는 다양한 Security 프로토콜에서 사용하는 인증서 체인에서 신뢰를 설정하는 데 사용할 수있는 루트 인증서 세트를 포함하기위한 것입니다.

결과적으로 TLS와 같은 중요한 Security 구성 요소는 OpenJDK 빌드에서 기본적으로 작동하지 않았습니다.

Oracle은 Java 10 을 통해 OpenJDK 빌드를 개발자에게 더 매력적으로 만들고 이러한 빌드와 Oracle JDK 빌드 간의 차이를 줄이기 위해 Oracle의 Java SE 루트 CA 프로그램에서 루트 인증서오픈 소스로 제공했습니다  .

8. 지원 중단 및 제거

8.1. 명령 줄 옵션 및 도구

네이티브 메서드를 구현하는 데 필요한 C 헤더 및 소스 파일을 생성 한 Java 10에서 javah  도구 가 제거되었습니다. 이제 javac -h  를 대신 사용할 수 있습니다.

policytool  은 정책 파일 생성 및 관리를위한 UI 기반 도구였습니다. 이것은 이제 제거되었습니다. 사용자는이 작업을 수행하기 위해 간단한 텍스트 편집기를 사용할 수 있습니다.

java -Xprof 옵션이 제거 되었습니다 . 이 옵션은 실행중인 프로그램을 프로파일 링하고 프로파일 링 데이터를 표준 출력으로 보내는 데 사용되었습니다. 이제 사용자는 대신 jmap  도구를 사용해야 합니다.

8.2. 아피스

더 이상 사용되지 않는 java.security.acl 패키지는 forRemoval = true로 표시되었으며 Java SE의 차기 버전에서 제거 될 수 있습니다. java.security.Policy  및 관련 클래스 로 대체되었습니다 .

마찬가지로 java.security. {Certificate, Identity, IdentityScope, Signer} API는 forRemoval = true 로 표시 됩니다.

9. 시간 기반 릴리스 버전 관리

Java 10부터 Oracle은 Java의 시간 기반 릴리스로 이동했습니다. 이는 다음과 같은 의미를 갖습니다.

  1. 6 개월마다 새로운 Java 릴리스. 2018 년 3 월 릴리스는 JDK 10, 2018 년 9 월 릴리스는 JDK 11 등입니다. 이를 기능 릴리스라고하며 적어도 하나 또는 두 개의 중요한 기능을 포함 할 것으로 예상됩니다.
  2. 기능 릴리스에 대한 지원은 다음 기능 릴리스까지 6 개월 동안 만 지속됩니다.
  3. 장기 지원 릴리스는 LTS로 표시됩니다. 이러한 릴리스에 대한 지원은 3 년입니다.
  4. Java 11은 LTS 릴리스입니다.

java -version  은 이제 GA 날짜를 포함 하므로 릴리스가 얼마나 오래되었는지 쉽게 식별 할 수 있습니다.

$ java -version
openjdk version "10" 2018-03-20
OpenJDK Runtime Environment 18.3 (build 10+46)
OpenJDK 64-Bit Server VM 18.3 (build 10+46, mixed mode)

10. 결론

이 기사에서는 Java 10에서 가져온 새로운 기능과 변경 사항을 살펴 보았습니다.

평소처럼 코드 스 니펫은 GitHub 에서 찾을 수 있습니다 .