Download - 자바9 특징 (Java9 Features)
2
새로운 툴인 "JShell" 을 제공◦ 쉘과 REPL(Read Evaluate Print Loop) 을 위한 것◦ 자바 클래스 , 인터페이스 , 객체 등의 생성을 매우 쉽게 실행하고 테스트하게 해줌
REPL(Read Evaluate Print Loop)◦ 읽고 (read), 계산하고 (evaluate), 출력하는 (print) 반복 구조◦ 스크립트 언어 (interactive interpreter shell ) 들의 다른 명칭 ( 예전 이름 )◦ 개발자가 간단한 코드를 입력하여 바로 결과값을 확인하게 해주는 편의성 툴
다운 가능한 곳 : https://jdk9.java.net/download/
Java 9 REPL (JShell)
3
Java 9 REPL (JShell)
G:\>jshell| Welcome to JShell -- Version 9-ea | For an introduction type: /help intro
jshell> int a = 10a ==> 10
jshell> System.out.println("a value = " + a )a value = 10
4
불변 List, Set, Map, Map.Entry 를 만들어주는 편리한 신규 팩토리 메서드 제공 비어있거나 비어있지 않은 Collection 객체를 만드는데 사용 자바 8 이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX 와 같은 유틸 메서드를 사용해서 불변 Collection 객체를 만듬
◦ 그러나 그 메서드들을 이용한 방법은 지루하고 장황◦ 그 단점을 없애기 위해서 새로운 팩토리 메서드를 추가 .
Factory Methods for Immutable List, Set, Map and Map.Entry
5
List 와 Set 인터페이스◦ "of" 메서드는 불변의 비어있거나 비어있지 않은 List 또는 Set 을 만들어줌
Empty List Example
Non-Empty List Example
Factory Methods for Immutable List, Set, Map and Map.Entry
List immutableList = List.of();
List immutableList = List.of("one","two","three");
6
Map 인터페이스◦ "of ", "ofEntires “ 메서드◦ 불변 Map 객체나 불변 Map.Entry 객체를 만듬
Empty Map Example
Non-Empty Map Example
Factory Methods for Immutable List, Set, Map and Map.Entry
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
7
Java8 에서 Default 와 Static 메서드를 이용해서 인터페이스에 구현체를 넣는 방법이 추가됨 하지만 private 으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었음
Private methods in Interfaces
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 모듈 시스템이 나옴
Java 9 Module System
9
JDK 9 는 92 모듈 ( 최종 릴리스에서 변경 될 수 있습니다 ) 와 함께 함 JDK 모듈을 사용할 수 있고 아래와 같이 자신의 모듈을 만들 수 있음 Simple Module Example
Java 9 Module System
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;}
10
Java 9 Module System
11
자바 9 에서 프로세스 API 를 개선함 다음과 같은 두 커플 형태의 신규 클래스가 추가되었다 .
◦ OS 프로세스를 관리 및 컨트롤할 있음 java.lang.ProcessHandle java.lang.ProcessHandle.Info
Process API Example
Process API Improvements
ProcessHandle currentProcess = ProcessHandle.current();System.out.println("Id: = " + currentProcess.getPid());
12
자바 7 에서 나온 자원 관리 방법 (try with resource) 을 개선 Java 7
Java 9
Try With Resources Improvement
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 를 반환
CompletableFuture API Improvements
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
Reactive Streams
15
자바 7 에서 Diamond Operator 를 추가했지만 ,자바 8 에서 익명 내부 클래스 사용시 한계가 있다는 것을 확인 해당 이슈를 수정하였고 아래와 같은 예를 들 수 있다 .
자세한 타입 파라미터 없이 단순히 "List" 만을 사용하였지만 상세한 타입을 알아서 확인해서 읽고 처리함
Diamond Operator for Anonymous Inner Class
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 객체 스트림으로 변환해줌
Optional Class Improvements
Stream<Optional> emp = getEmployee(id) Stream empStream = emp.flatMap(Optional::stream)
17
Stream 인터페이스에 사용 가능한 4 개의 메서드가 추가 Stream 은 인터페이스이므로 신규 구현된 메서드는 모두 default 메서드 그 중 두 개는 매우 중요
◦ dropWhile 메서드 ◦ takeWhile 메서드
takeWhile 은 인수로서의 predicate 를 취하고 주어진 값의 스트림 서브셋을 리턴 해당 값을 만족시키는 값이 없으면 빈 스트림을 리턴 .
Stream API Improvements
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10) .takeWhile(i -> i < 5 ) .forEach(System.out::println);1234
18
자바 8 과 이전 버전에서 @Deprecated 어느테이션◦ 어떤 메서드도 없이 단순히 마커 인터페이스
Java SE 9 에서 Oracle Corporation 은 @Deprecated 주석을 강화◦ 지원 중단 된 API 에 대한 자세한 정보를 제공◦ 지원 중단 된 API 의 정적 사용을 분석하는 도구를 제공
forRemoval 고 since 가 추가됨 ( 정보 제공 )
Enhanced @Deprecated annotation
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
HTTP 2 Client
20
Java SE 9 에서 새로운 multi-Resolution Image API 를 도입 예정 이 API 의 중요한 인터페이스는 MultiResolutionImage
java.awt.image 패키지로 이용 가능 MultiResolutionImage
◦ 서로 다른 높이와 너비 ( 해상도가 다름 ) 의 이미지 세트를 캡슐화◦ 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록 함
Мulti-Resolution Image API
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
Miscellaneous Java 9 Features
22
1. Java9 Features(http://www.journaldev.com/13121/java-9-features-with-examples)
Reference