2. 새로운 툴인 "JShell"을 제공
◦ 쉘과 REPL(Read Evaluate Print Loop)을 위한 것
◦ 자바 클래스, 인터페이스, 객체 등의 생성을 매우 쉽게 실행하고 테스트하게 해줌
REPL(Read Evaluate Print Loop)
◦ 읽고(read), 계산하고(evaluate), 출력하는(print) 반복 구조
◦ 스크립트 언어 (interactive interpreter shell )들의 다른 명칭(예전 이름)
◦ 개발자가 간단한 코드를 입력하여 바로 결과값을 확인하게 해주는 편의성 툴
다운 가능한 곳 : https://jdk9.java.net/download/
2
3. 3
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
4. 불변 List, Set, Map, Map.Entry를 만들어주는 편리한 신규 팩토리 메서드 제공
비어있거나 비어있지 않은 Collection 객체를 만드는데 사용
자바8이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX와 같은
유틸 메서드를 사용해서 불변 Collection 객체를 만듬
◦ 그러나 그 메서드들을 이용한 방법은 지루하고 장황
◦ 그 단점을 없애기 위해서 새로운 팩토리 메서드를 추가.
4
5. List와 Set 인터페이스
◦ "of" 메서드는 불변의 비어있거나 비어있지 않은 List 또는 Set을 만들어줌
Empty List Example
Non-Empty List Example
5
List immutableList = List.of();
List immutableList = List.of("one","two","three");
7. Java8에서 Default와 Static 메서드를 이용해서 인터페이스에 구현체를 넣는 방법이
추가됨
하지만 private으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었음
7
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
8. 자바9의 큰 변화 중 하나는 모듈 시스템
직소 프로젝트(Jigsaw project)는 다음과 같은 특징을 갖고 있음
◦ Modular JDK
◦ Modular Java Source Code
◦ Modular Run-time Images
◦ Encapsulate Java Internal APIs
◦ Java Platform Module System
자바 SE 9 버전 전에는 자바 기반 응용 프로그램을 개발할 때 모노리틱
(monolithic) Jar 방식을 사용했음
◦ 한계와 단점이 많았음
◦ 이러한 모든 단점을 방지하기 위해, 자바 SE 9 모듈 시스템이 나옴
8
9. JDK 9는 92 모듈 (최종 릴리스에서 변경 될 수 있습니다)와 함께 함
JDK 모듈을 사용할 수 있고 아래와 같이 자신의 모듈을 만들 수 있음
Simple Module Example
9
module com.atin.monitor.ui {
requires javafx.base;
requires javafx.controls;
requires javafx.graphics;
exports com.atin.monitor.ui.launch;
exports com.atin.monitor.ui.show;
}
11. 자바9에서 프로세스 API를 개선함
다음과 같은 두 커플 형태의 신규 클래스가 추가되었다.
◦ OS 프로세스를 관리 및 컨트롤할 있음
java.lang.ProcessHandle
java.lang.ProcessHandle.Info
Process API Example
11
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Id: = " + currentProcess.getPid());
12. 자바 7에서 나온 자원 관리 방법(try with resource)을 개선
Java 7
Java 9
12
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());
}
}
13. 자바8에서 CompletableFuture가 가지는 문제점을 개선
delayedExecutor()은 static 유틸 메서드로 사용
주어진 시간 딜레이 이후에 기본 실행자로 보내진 new Executor를 반환
13
Executor exe =
CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
14. 리액티브 프로그래밍은 큰 인기를 끌고 있음
Scala, Play, Akka 등의 프레임워크는 이미 리액티브 스트림을 구축
Java9은 새로운 리액티브 스트림 API를 추가함
자바9의 리액티브 스트림 API
◦ 자바 언어를 이용해서 매우 쉽게 병행성, 확장성, 비동기 애플리케이션을 구현
한 Publish / Subscribe 프레임워크
◦ API
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
14
15. 자바 7에서 Diamond Operator를 추가했지만,
자바 8에서 익명 내부 클래스 사용시 한계가 있다는 것을 확인
해당 이슈를 수정하였고 아래와 같은 예를 들 수 있다.
자세한 타입 파라미터 없이 단순히 "List"만을 사용하였지만 상세한 타입을 알아서 확
인해서 읽고 처리함
15
public List getEmployee(String empid){
// Code to get Employee details from Data Store
return new List(emp){ };
}
16. Optional 클래스에 신규 메서드를 추가
값이 Optional 객체로 주어질 때 Stream 메서드는 값과 함께 sequential stream을
리턴, 값이 비어 있다면 빈 스트림을 리턴함
다음은 Optional에서 stream의 사용 형태를 보여준다.
위 Optional.stream 메서드는 Employee 객체의 Optional 스트림을 Employee 객
체 스트림으로 변환해줌
16
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
17. Stream 인터페이스에 사용 가능한 4개의 메서드가 추가
Stream은 인터페이스이므로 신규 구현된 메서드는 모두 default 메서드
그 중 두 개는 매우 중요
◦ dropWhile 메서드
◦ takeWhile 메서드
takeWhile은 인수로서의 predicate를 취하고 주어진 값의 스트림 서브셋을 리턴
해당 값을 만족시키는 값이 없으면 빈 스트림을 리턴.
17
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
18. 자바8과 이전 버전에서 @Deprecated 어느테이션
◦ 어떤 메서드도 없이 단순히 마커 인터페이스
Java SE 9에서 Oracle Corporation은 @Deprecated 주석을 강화
◦ 지원 중단 된 API에 대한 자세한 정보를 제공
◦ 지원 중단 된 API의 정적 사용을 분석하는 도구를 제공
forRemoval고 since가 추가됨 (정보 제공)
18
19. 추가 배경
◦ HTTP/2 프로토콜과 WebSocket 기능을 지원하기 위함
◦ 기존 HTTP 클라이언트 API에 많은 문제점이 있음
새로운 HTTP 2 클라이언트 API가 추가
◦ "java.net.http" 패키지에 새로운 HTTP 2 클라이언트 API 도입
◦ HTTP / 1.1 및 HTTP / 2 프로토콜 모두 지원
◦ 동기화(블로킹 모드)와 비동기 모드 모두 지원
◦ WebSocket API를 사용하여 비동기 모드 지원
상세 자료
◦ http://download.java.net/java/jdk9/docs/api/java/net/http/package-
summary.html
19
20. Java SE 9에서 새로운 multi-Resolution Image API를 도입 예정
이 API의 중요한 인터페이스는 MultiResolutionImage
java.awt.image 패키지로 이용 가능
MultiResolutionImage
◦ 서로 다른 높이와 너비 (해상도가 다름)의 이미지 세트를 캡슐화
◦ 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록 함
20
21. 기타 특징 (덜 중요한 특징은 아님)
◦ GC (Garbage Collector) Improvements
◦ Stack-Walking API
◦ Filter Incoming Serialization Data
◦ Deprecate the Applet API
◦ Indify String Concatenation
◦ Enhanced Method Handles
◦ Java Platform Logging API and Service
◦ Compact Strings
◦ Parser API for Nashorn
◦ Javadoc Search
◦ HTML5 Javadoc
21