Java9 새로운 기능

Java9 새로운 기능

from : http://www.journaldev.com/13121/java-9-features-with-examples

1. Java9 다운로드 받는곳 

https://jdk9.java.net/download/

2. JAVA9의 주요 기능 

2.1 Java 9 REPL [Read Evaluate Print Loop] : (JShell)

- Java 9 는 REPL이라는 jShell을 제공한다.
- 이를 통해 자바도 인터렉티브한 테스트와 실행을 할 수 있다.
KIDOui-iMac:~ KIDO$ jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro
jshell> int a = 10
a ==> 10

jshell> System.out.print  <-- tab click..
print(     printf(    println(

jshell> System.out.println(a)
10


2.2 Immutable List, Set, Map, Map.Entity를 위한 Factory 메소드 제공

- Immutable 자료구조를 생성하기 위한 편의 Factory메소드를 제공하고 있다.
- java8 이전 버젼에서는 Collections.unmodifiableXXX라는 기능을 이용하여 이러한 불변 자료구조를 만들었다.
Collections.unmodificableList
- 이제는 Collections객체의 of메소드를 이용하여 이러한 자료구조를 편하게 생성할 수 있다.
jshell> List testImmutableList = List.of()
testImmutableList ==> []

jshell> testImmutableList.add <-- tab click..
add(      addAll(

jshell> testImmutableList.add(10)
|  Warning:
|  unchecked call to add(E) as a member of the raw type java.util.List
|  testImmutableList.add(10)
|  ^-----------------------^
|  java.lang.UnsupportedOperationException thrown:
|        at ImmutableCollections.uoe (ImmutableCollections.java:70)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:76)
|        at (#4:1)
jshell> List<Long> testLongImmutableList = List.of()
testLongImmutableList ==> []
jshell> testLongImmutableList.add(10L)
|  java.lang.UnsupportedOperationException thrown:
|        at ImmutableCollections.uoe (ImmutableCollections.java:70)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:76)
|        at (#6:1)

- 위 에제를 보면 불변의 자료구조라 값을 넣을 수 없다는 것을 알 수 있다.
jshell> List testDefaultStringImmutableList = List.of("Kido", "Kirog", "Uncle", "Bob")
testDefaultStringImmutableList ==> [Kido, Kirog, Uncle, Bob]
- Map은 다음과 같이 지정하면된다.
jshell> Map testMap = Map.of()
testMap ==> {}


jshell> testMap.put("1", "test")
|  Warning:
|  unchecked call to put(K,V) as a member of the raw type java.util.Map
|  testMap.put("1", "test")
|  ^----------------------^
|  java.lang.UnsupportedOperationException thrown:
|        at ImmutableCollections.uoe (ImmutableCollections.java:70)
|        at ImmutableCollections$AbstractImmutableMap.put (ImmutableCollections.java:557)
|        at (#9:1)

jshell> Map testDefaultValueMap = Map.of("1", "Kido", "2", "Kirog", "3", "Uncle", "4", "Bae")
testDefaultValueMap ==> {4=Bae, 3=Uncle, 2=Kirog, 1=Kido}

2.3 Interface 의 method를 private로 지정 가능 

- Java8에서는  Interface에 default메소드를 제공했다. 이는 Default, Static으로 제공되었으나 public 접근 제한자를 지원했다.
- Java9에서는 private 메소드를 제공한다. private메소드, 그리고 private static메소드를 제공한다.

public interface Card {
    private Long createCard() {
        // 내용구현하기.
    }
    private static void displayCardDetails() {
        // 여기에서 내용 구현하기.
    }
}

2.4 Module System 

- Java9 기능 중에서 가장 큰 변화중의 하나는 Module System.
- Modular JDK
- Modular Java Source Code
- Modular Run-time Image
- Encapsulate Java Internal APIs
- Java Platform Module System 
Java 9 이전버젼은 획일적인 Jar을 이용하여 자바 기반 어플리케이션을 개발했었다. 이것은 제약이 많고 결점이 있다. 이를 해결하기 위한 기능으로 Module System을 채택하였다.

- 자세한것은 쩜더 공부해서 추가하기.

2.5 Process API 향상

- Java 9에서는 Process API에 대한 향상을 제공한다. 이를 위해 새로운 클래스들과 메소드 들을 제공하며, 이것은 OS Process 컨트롤과 관리를 쉽게 해준다.

- Java.lang.ProcessHandle
- Java.lang.ProcessHandle.Info
example :
jshell> ProcessHandle handle = ProcessHandle.current()
handle ==> 53386
jshell> System.out.println("PID " + handle.getPid())
PID 53386

2.6 Try-With-Resources 향상

- Java7 에서는 새로운 예외 처리를 위한 구문인 : Try-With-Resource로 리소스를 자동적으로 관리 하는 것을 소개하였다. 이를 사용하는 이유는 더 낳은 리소스 관리를 위한 것이다.

- Java9 버젼에서는 장황한 코딩을 막고 더 읽기 쉽도록 개선되었다.
void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

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

2.7 CompletableFuture API 개선

- Java8에서 문제를 발생시키던 Java9에서는 CompletableFuture API에 대한 개선을 가져왔다.
- delays와 timeouts를 추가하였다.

Executor exe = CompletableFuture.delayExecutor(50L, TimeUnit.SECONDS);
delayExecutor메소드는 정적 유틸리티 메소드로 Executor를 반환한다. 그리고 주어진 딜레이 이후에 해당 태스크를 제출한다.

2.8 Reactive Streams

- Reactive 프로그래밍은 최근 몇가지 매우 좋은 이점들로 인해서 유명해졌다. 프레임워크들은 이미 Reactive Streams과 많은 이점들을 준다.
- Reactive Streams API는 Publish/Subscribe 프레임워크로 비동기 구현을 수행할 수 있게 해준다. 또한 확장성, 병렬 어플리케이션을 매우 쉽게 개발 할 수 있도록 한다.
- Java9는 아래 API를 제공한다.
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor

2.9 Anonymous Inner Class를 위한 <> 오퍼레이터 제공

- Java7에서 새로운 기능으로 소개된 다이아몬드 오퍼레이터는 장환한 코드를 제거해주었다. 그러나 Anonymous Inner Class 에서 다이아몬드 오퍼레이터의 사용은 한계가 있었다.

public List getEmployee(String empid) {
    // 상세 코드를 작성하면 된다.
    return new List(emp) {};
}
위 코드는 List를 이용하고 타입 파라미터를 지정하지 않고 사용하 ㄹ수 있다.

2.10 Optional Class Improvements

java.util.Optional 클래스에 새로이 유용한 메소드가 추가되어 있다.

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

2.11 Stream API 개선 

- Java9에서는 java.util.Stream인터페이스에 유용한 메소드가 추가 되었다. Stream은 인터페이스이며, 새로운 인터페이스는 default메소드로 구현 되었다.  이들 중 2개는 dropWhile과 takeWhile메소드로 매우 중요한 메소드이다.
- 만약 Scala나 Functional 프로그래밍 언어에 익숙하다면 이러한 메소드를 알 것이다. 이들은 함수형 스타일로 개발할때 매우 유용하다.
- takeWhile은 아규먼트를 예측하고, 처음으로 Predicate가 false를 반환할때까지 주어진 스트림 값의 서브셋 스트림을 반환한 값을 채택한다. 만약 처음 값이 Predicate를 만족하지 못하다면 비어있는 스트림을 반환하게 될 것이다.

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

2.12 @Deprecated annotation 개선. 

- Java8 이전에서는 @Deprecate 어노테이션은 단순히 마커 인터페이스였다. 이는 클래스, 필드, 인터페이스, 메소드, 생성자, enum등에서 사용되었다.
- Java9 에서는 더 많은 정보를 추가할 수 있고, deprecated API의 정적 사용에 대한 분석툴을 제공한다.
- forRemoval과 since 메소드를 제공하고 있으며 이는 이러한 정보들을 제공한다.

2.13 HTTP2 Client

- HTTP/2 프로토콜을 지원하기 위한 클라이언트 API를 릴리즈 하였고 WebSocket 기능도 제공한다. 이전에 있던 Legacy HTTP Client API는 HTTP/1만 지원했고 HTTP/2를 지원하지 못하거나 WebSocket을 ㄷ지원하지 않았고, Blocking모드에서만 동작하거나 성능상의 이슈가 있었다.
- Java9에서는 java.net.http 패키지 하위에 이러한 HTTP/2 Client API를 추가하였다. 이는 HTTP/1과 HTTP/2를 둘다 제공한다. 또한 Synchronous (Blocking모드)와 asynchronous (Non Blocking모드) 모두 지원한다. 또한 Asynchronous모드에서 WebSocket을 지원한다.

import java.net.http.*;
import static java.net.http.HttpRequest.*;
import static java.net.http.HttpResponse.*;
...
URI uri = new URI("http://daum.net");
HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
System.out.println("Response was " + response.body(asString()))

2.14. Multi-Resolution Image API

- Java9에서는 Multi-Resolution Image API를 소개했다. 이는 MultiResolutionImage 인터페이스이며 java.awk.image패키지에 포함된다.
- 이는 서로다른 높이, 넓이를 가지는 이미지에 대해서 필요한 기능들을 제공하고 있다.

2.15. 기타

- GC(Garbage Collector) 향상
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate the Applet API
- Enhanced Method Handles
- Java Platform Logging API and Service
- Compact Strings
- Parser API for Nashorn
- Javadoc Search
- HTML5 javadoc