웹사이트 검색

예제가 포함된 Java 9 기능


Java 9는 주요 릴리스이며 개발자를 위한 많은 기능을 제공합니다. 이 기사에서는 Java 9 기능을 자세히 살펴보겠습니다.

Java 10이 릴리스되었습니다. Java 10 릴리스에 대한 전체 개요는 Java 10 기능을 참조하십시오.

자바 9 기능

  1. 자바 9 REPL(JShell)
  2. 불변 목록, 세트, 맵 및 Map.Entry에 대한 팩토리 메소드
  3. 인터페이스의 개인 메소드
  4. 자바 9 모듈 시스템
  5. 프로세스 API 개선
  6. 리소스 개선 시도
  7. CompletableFuture API 개선
  8. 반응 스트림
  9. 익명의 내부 클래스를 위한 다이아몬드 연산자
  10. 선택적 클래스 개선
  11. 스트림 API 개선
  12. 향상된 @Deprecated 주석
  13. HTTP 2 클라이언트
  14. 다중 해상도 이미지 API
  15. 기타 Java 9 기능

Oracle Corporation은 2017년 3월 말경 Java SE 9를 출시할 예정입니다. 이 게시물에서는 \Java 9 기능\에 대해 몇 가지 예를 들어 간략하게 설명하겠습니다.

자바 9 REPL(JShell)

Oracle Corp은 "jshell\이라는 새로운 도구를 도입했습니다. Java Shell을 나타내며 REPL(Read Evaluate Print Loop)이라고도 합니다. 클래스, 인터페이스, 열거형, 개체, 명령문과 같은 모든 Java 구성을 실행하고 테스트하는 데 사용됩니다. 등 매우 쉽게 https://jdk9.java.net/download/에서 JDK 9 EA(Early Access) 소프트웨어를 다운로드할 수 있습니다.

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

REPL 도구에 대해 더 알고 싶다면 Java 9 REPL 기능(Part-2)을 참조하십시오.

변경할 수 없는 목록, 집합, 지도 및 Map.Entry에 대한 팩토리 메서드

Oracle Corp은 Immutable List, Set, Map 및 Map.Entry 객체를 생성하는 몇 가지 편리한 팩토리 메서드를 도입했습니다. 이러한 유틸리티 메서드는 비어 있거나 비어 있지 않은 컬렉션 개체를 만드는 데 사용됩니다. Java SE 8 및 이전 버전에서는 unmodifiableXXX와 같은 Collections 클래스 유틸리티 메서드를 사용하여 Immutable Collection 객체를 생성할 수 있습니다. 예를 들어 Immutable List를 만들고 싶다면 Collections.unmodifiableList 메서드를 사용할 수 있습니다. 그러나 이러한 Collections.unmodifiableXXX 메서드는 지루하고 장황한 접근 방식입니다. 이러한 단점을 극복하기 위해 Oracle Corp은 List, Set 및 Map 인터페이스에 몇 가지 유틸리티 메서드를 추가했습니다. List 및 Set 인터페이스에는 아래와 같이 비어 있거나 비어 있지 않은 Immutable List 또는 Set 객체를 생성하는 "of()\ 메서드가 있습니다.

List immutableList = List.of();

비어 있지 않은 목록 예

List immutableList = List.of("one","two","three");

Map에는 각각 Immutable Map 객체와 Immutable Map.Entry 객체를 생성하는 of() 메서드와 ofEntries() 메서드의 두 가지 메서드 세트가 있습니다. 빈 지도 예

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

비어 있지 않은 지도 예

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

이러한 유틸리티 방법에 대해 자세히 알아보려면 다음 링크를 참조하십시오.

  • 불변 목록에 대한 Java 9 팩토리 메서드
  • 불변 집합에 대한 Java 9 팩토리 메서드
  • 불변 맵 및 Map.Entry에 대한 Java 9 팩토리 메소드

인터페이스의 개인 메소드

Java 8에서는 기본 및 정적 메서드를 사용하여 인터페이스에서 메서드 구현을 제공할 수 있습니다. 그러나 인터페이스에서 전용 메서드를 만들 수는 없습니다. 중복 코드와 더 많은 재사용 가능성을 피하기 위해 Oracle Corp은 Java SE 9 인터페이스에 전용 메서드를 도입할 예정입니다. Java SE 9부터는 'private' 키워드를 사용하여 인터페이스에 비공개 및 비공개 정적 메서드도 작성할 수 있습니다. 이러한 private 메서드는 다른 클래스의 private 메서드와 같을 뿐 차이가 없습니다.

public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

이 새로운 기능에 대해 자세히 알아보려면 인터페이스의 Java 9 Private 메서드 링크를 참조하십시오.

Java 9 모듈 시스템

큰 변경 사항 또는 Java 9 기능 중 하나는 모듈 시스템입니다. Oracle Corp은 Jigsaw Project의 일부로 다음 기능을 도입할 예정입니다.

  • 모듈식 JDK
  • 모듈식 Java 소스 코드
  • 모듈식 런타임 이미지
  • Java 내부 API 캡슐화
  • 자바 플랫폼 모듈 시스템

Java SE 9 버전 이전에는 Monolithic Jars를 사용하여 Java 기반 애플리케이션을 개발하고 있습니다. 이 아키텍처에는 많은 제한과 단점이 있습니다. 이러한 모든 단점을 피하기 위해 Java SE 9는 모듈 시스템과 함께 제공됩니다. JDK 9는 92개의 모듈과 함께 제공됩니다(최종 릴리스에서 변경될 수 있음). JDK 모듈을 사용할 수 있으며 아래와 같이 자체 모듈을 만들 수도 있습니다. 간단한 모듈 예

module com.foo.bar { }

여기서는 '모듈'을 사용하여 간단한 모듈을 만듭니다. 각 모듈에는 이름, 관련 코드 및 기타 리소스가 있습니다. 이 새로운 아키텍처 및 실습 경험에 대한 자세한 내용을 보려면 여기에서 내 원래 자습서를 살펴보십시오.

  • 자바 9 모듈 시스템 기본 사항
  • 명령 프롬프트를 사용하는 Java 9 모듈 예제
  • Eclipse IDE를 사용한 Java 9 Hello World 모듈 예제

프로세스 API 개선

Java SE 9에는 Process API가 일부 개선되었습니다. 그들은 OS 프로세스의 제어 및 관리를 쉽게 하기 위해 몇 가지 새로운 클래스와 메서드를 추가했습니다. Process API의 두 가지 새로운 인터페이스:

  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info

프로세스 API 예제

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

리소스 개선 시도

우리는 Java SE 7이 리소스를 자동으로 관리하는 Try-With-Resources라는 새로운 예외 처리 구조를 도입했음을 알고 있습니다. 이 새 문의 주요 목표는 "자동으로 더 나은 리소스 관리\입니다. Java SE 9는 더 많은 장황함을 피하고 가독성을 개선하기 위해 이 문의 일부 개선 사항을 제공할 예정입니다. Java SE 7 예

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

자바 9 예

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

이 새로운 기능에 대한 자세한 내용은 Java 9 Try-With-Resources Improvements에서 원래 튜토리얼을 참조하십시오.

CompletableFuture API 개선 사항

Java SE 9에서 Oracle Corp은 Java SE 8에서 제기된 일부 문제를 해결하기 위해 CompletableFuture API를 개선할 예정입니다. 일부 지연 및 시간 초과, 일부 유틸리티 메서드 및 더 나은 하위 클래스를 지원하기 위해 추가할 예정입니다.

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

여기서 DelayExecutor()는 주어진 지연 후에 작업을 기본 실행기에 제출하는 새 실행기를 반환하는 데 사용되는 정적 유틸리티 메서드입니다.

반응성 스트림

오늘날 리액티브 프로그래밍은 아름다운 이점을 얻기 위해 애플리케이션을 개발하는 데 매우 인기가 있습니다. Scala, Play, Akka 등 프레임워크는 이미 Reactive Streams를 통합하여 많은 이점을 얻고 있습니다. Oracle Corps는 또한 Java SE 9에 새로운 Reactive Streams API를 도입하고 있습니다. Java SE 9 Reactive Streams API는 Java 언어를 사용하여 매우 쉽게 비동기, 확장 가능 및 병렬 애플리케이션을 구현하기 위한 게시/구독 프레임워크입니다. Java SE 9는 Java 기반 애플리케이션에서 Reactive Streams를 개발하기 위해 다음 API를 도입했습니다.

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.구독자
  • java.util.concurrent.Flow.Processor

Java 9 Reactive Streams에서 자세히 알아보세요.

익명의 내부 클래스를 위한 다이아몬드 연산자

우리는 Java SE 7에 하나의 새로운 기능이 도입되었다는 것을 알고 있습니다. 중복 코드와 장황함을 방지하고 가독성을 향상시키는 Diamond Operator입니다. 그러나 Java SE 8에서 Oracle Corp(Java Library Developer)는 Anonymous Inner Class와 함께 Diamond 연산자를 사용하는 데 몇 가지 제한 사항이 있음을 발견했습니다. 그들은 이러한 문제를 수정했으며 Java 9의 일부로 릴리스할 예정입니다.

  public List getEmployee(String empid){
     // Code to get Employee details from Data Store
     return new List(emp){ };
  }

여기서는 유형 매개변수를 지정하지 않고 "List\만 사용하고 있습니다.

선택적 클래스 개선

Java SE 9에서 Oracle Corp은 java.util.Optional 클래스에 몇 가지 유용한 새 메서드를 추가했습니다. 여기서는 몇 가지 간단한 예를 통해 이러한 메서드 중 하나에 대해 설명하겠습니다. 스트림 메서드 주어진 옵션 개체에 값이 있으면 이 stream() 메서드는 해당 값을 가진 순차적 스트림을 반환합니다. 그렇지 않으면 빈 스트림을 반환합니다. 아래와 같이 선택적 개체에서 느리게 작동하도록 "stream()\ 메서드를 추가했습니다.

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

여기에서 Optional.stream() 메서드는 Employee 개체의 선택 항목 스트림을 직원 스트림으로 변환하는 데 사용되어 결과 코드에서 이 결과에 대해 느리게 작업할 수 있습니다. 더 많은 예제와 함께 이 기능에 대해 자세히 이해하고 선택적 클래스에 추가된 더 많은 새 메서드를 읽으려면 Java SE 9: 선택적 클래스 개선에서 원래 튜토리얼을 참조하십시오.

스트림 API 개선

Java SE 9에서 Oracle Corp은 java.util.Stream 인터페이스에 유용한 새 메소드 4개를 추가했습니다. Stream은 인터페이스이므로 새로 구현된 모든 메서드는 기본 메서드입니다. 그 중 두 가지가 매우 중요합니다. dropWhile 및 takeWhile 메서드 Scala 언어 또는 Functions 프로그래밍 언어에 익숙하다면 이러한 메서드에 대해 확실히 알고 있을 것입니다. 이들은 기능적 스타일 코드를 작성하는 데 매우 유용한 방법입니다. 여기에서 takeWhile 유틸리티 방법에 대해 논의하겠습니다. 이 takeWhile()은 조건자를 인수로 취하고 해당 조건자가 처음으로 false를 반환할 때까지 주어진 Stream 값의 하위 집합의 Stream을 반환합니다. 첫 번째 값이 해당 조건자를 만족하지 않으면 빈 스트림만 반환합니다.

jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4

takeWhile 및 dropWhile 메서드 및 기타 새로운 메서드에 대한 자세한 내용은 Java SE 9: Stream API Improvements에서 원래 튜토리얼을 참조하십시오.

향상된 @Deprecated 주석

Java SE 8 및 이전 버전에서 @Deprecated 주석은 더 이상 사용되지 않는 API에 대한 자세한 정보를 제공하고 더 이상 사용되지 않는 API의 애플리케이션 정적 사용을 분석하는 도구도 제공합니다. 그들은 이 Deprecated 인터페이스에 forRemoval 및 since 이 정보를 제공하는 두 가지 방법을 추가했습니다.

HTTP 2 클라이언트

Java SE 9에서 Oracle Corp은 HTTP/2 프로토콜 및 WebSocket 기능을 지원하는 새로운 HTTP 2 클라이언트 API를 출시할 예정입니다. 기존 또는 레거시 HTTP 클라이언트 API에는 많은 문제(예: HTTP/1.1 프로토콜 지원, HTTP/2 프로토콜 및 WebSocket 지원 안 함, 차단 모드에서만 작동 및 많은 성능 문제)가 있으므로 이 HttpURLConnection API를 새로운 HTTP로 대체하고 있습니다. 고객. 그들은 "java.net.http\ 패키지 아래에 새로운 HTTP 2 클라이언트 API를 도입할 예정입니다. HTTP/1.1 및 HTTP/2 프로토콜을 모두 지원합니다. 동기(차단 모드) 및 비동기 모드를 모두 지원합니다. 비동기를 지원합니다. WebSocket API를 사용하는 모드 https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html에서 이 새 API를 볼 수 있습니다. HTTP 2 클라이언트 예제

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

몇 가지 유용한 예제와 함께 Java SE 9: HTTP/2 프로토콜 및 WebSocket, 새 API의 이점 및 이전 API의 단점을 이해하기 위한 HTTP 2 클라이언트에서 원래 자습서를 살펴보십시오.

다중 해상도 이미지 API

Java SE 9에서 Oracle Corp은 새로운 Multi-Resolution Image API를 도입할 예정입니다. 이 API의 중요한 인터페이스는 MultiResolutionImage 입니다. java.awt.image 패키지에서 사용할 수 있습니다. MultiResolutionImage는 높이와 너비(해상도가 다름)가 다른 이미지 집합을 캡슐화하고 요구 사항에 따라 쿼리할 수 있도록 합니다.

기타 Java 9 기능

이 섹션에서는 몇 가지 기타 Java SE 9 새 기능을 나열합니다. 이것이 덜 중요한 기능이라고 말하는 것이 아닙니다. 그것들은 또한 몇 가지 유용한 예와 함께 그것들을 아주 잘 이해하는 데 중요하고 유용합니다. 현재로서는 이러한 기능에 대한 충분한 정보를 얻지 못했습니다. 그래서 간단한 이해를 위해 여기에 나열하겠습니다. 이러한 기능을 하나씩 선택하고 위의 섹션에 간단한 설명과 예제를 추가하겠습니다. 그리고 마지막으로 나중에 별도의 튜토리얼을 작성합니다.

  • GC(가비지 수집기) 개선
  • 스택 워킹 API
  • 수신 직렬화 데이터 필터링
  • 애플릿 API 지원 중단
  • 문자열 연결 표시
  • 향상된 메서드 핸들
  • Java 플랫폼 로깅 API 및 서비스
  • 컴팩트 문자열
  • Nashorn용 파서 API
  • Javadoc 검색
  • HTML5 자바독

이 Java 9 기능을 하나씩 선택하고 충분한 설명과 예제로 업데이트하겠습니다. 이것이 예제와 함께 Java 9 기능에 대한 간략한 설명입니다.