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")- Map은 다음과 같이 지정하면된다.
testDefaultStringImmutableList ==> [Kido, Kirog, Uncle, Bob]
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 JDKJava 9 이전버젼은 획일적인 Jar을 이용하여 자바 기반 어플리케이션을 개발했었다. 이것은 제약이 많고 결점이 있다. 이를 해결하기 위한 기능으로 Module System을 채택하였다.
- Modular Java Source Code
- Modular Run-time Image
- Encapsulate Java Internal APIs
- Java Platform Module System
- 자세한것은 쩜더 공부해서 추가하기.
2.5 Process API 향상
- Java 9에서는 Process API에 대한 향상을 제공한다. 이를 위해 새로운 클래스들과 메소드 들을 제공하며, 이것은 OS Process 컨트롤과 관리를 쉽게 해준다.- Java.lang.ProcessHandleexample :
- Java.lang.ProcessHandle.Info
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) {위 코드는 List를 이용하고 타입 파라미터를 지정하지 않고 사용하 ㄹ수 있다.
// 상세 코드를 작성하면 된다.
return new List(emp) {};
}
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