자바9 특징 (java9 features)

22
JAVA 9 Features 한한한 (Chang-Hwan Han) [email protected]

Upload: chang-hwan-han

Post on 16-Apr-2017

517 views

Category:

Software


2 download

TRANSCRIPT

Page 1: 자바9 특징 (Java9 Features)

JAVA 9 Features한창환 (Chang-Hwan Han)

[email protected]

Page 2: 자바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)

Page 3: 자바9 특징 (Java9 Features)

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

Page 4: 자바9 특징 (Java9 Features)

4

불변 List, Set, Map, Map.Entry 를 만들어주는 편리한 신규 팩토리 메서드 제공 비어있거나 비어있지 않은 Collection 객체를 만드는데 사용 자바 8 이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX 와 같은 유틸 메서드를 사용해서 불변 Collection 객체를 만듬

◦ 그러나 그 메서드들을 이용한 방법은 지루하고 장황◦ 그 단점을 없애기 위해서 새로운 팩토리 메서드를 추가 .

Factory Methods for Immutable List, Set, Map and Map.Entry

Page 5: 자바9 특징 (Java9 Features)

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");

Page 6: 자바9 특징 (Java9 Features)

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}

Page 7: 자바9 특징 (Java9 Features)

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. }}

Page 8: 자바9 특징 (Java9 Features)

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

Page 9: 자바9 특징 (Java9 Features)

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;}

Page 10: 자바9 특징 (Java9 Features)

10

Java 9 Module System

Page 11: 자바9 특징 (Java9 Features)

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());

Page 12: 자바9 특징 (Java9 Features)

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()); }}

Page 13: 자바9 특징 (Java9 Features)

13

자바 8 에서 CompletableFuture 가 가지는 문제점을 개선

delayedExecutor() 은 static 유틸 메서드로 사용 주어진 시간 딜레이 이후에 기본 실행자로 보내진 new Executor 를 반환

CompletableFuture API Improvements

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

Page 14: 자바9 특징 (Java9 Features)

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

Page 15: 자바9 특징 (Java9 Features)

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){ };}

Page 16: 자바9 특징 (Java9 Features)

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)

Page 17: 자바9 특징 (Java9 Features)

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

Page 18: 자바9 특징 (Java9 Features)

18

자바 8 과 이전 버전에서 @Deprecated 어느테이션◦ 어떤 메서드도 없이 단순히 마커 인터페이스

Java SE 9 에서 Oracle Corporation 은 @Deprecated 주석을 강화◦ 지원 중단 된 API 에 대한 자세한 정보를 제공◦ 지원 중단 된 API 의 정적 사용을 분석하는 도구를 제공

forRemoval 고 since 가 추가됨 ( 정보 제공 )

Enhanced @Deprecated annotation

Page 19: 자바9 특징 (Java9 Features)

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

Page 20: 자바9 특징 (Java9 Features)

20

Java SE 9 에서 새로운 multi-Resolution Image API 를 도입 예정 이 API 의 중요한 인터페이스는 MultiResolutionImage

java.awt.image 패키지로 이용 가능 MultiResolutionImage

◦ 서로 다른 높이와 너비 ( 해상도가 다름 ) 의 이미지 세트를 캡슐화◦ 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록 함

Мulti-Resolution Image API

Page 21: 자바9 특징 (Java9 Features)

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