ݺߣ

ݺߣShare a Scribd company logo
JAVA 9 Features
한창환 (Chang-Hwan Han)
atin84@gmail.com
 새로운 툴인 "JShell"을 제공
◦ 쉘과 REPL(Read Evaluate Print Loop)을 위한 것
◦ 자바 클래스, 인터페이스, 객체 등의 생성을 매우 쉽게 실행하고 테스트하게 해줌
 REPL(Read Evaluate Print Loop)
◦ 읽고(read), 계산하고(evaluate), 출력하는(print) 반복 구조
◦ 스크립트 언어 (interactive interpreter shell )들의 다른 명칭(예전 이름)
◦ 개발자가 간단한 코드를 입력하여 바로 결과값을 확인하게 해주는 편의성 툴
 다운 가능한 곳 : https://jdk9.java.net/download/
2
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
 불변 List, Set, Map, Map.Entry를 만들어주는 편리한 신규 팩토리 메서드 제공
 비어있거나 비어있지 않은 Collection 객체를 만드는데 사용
 자바8이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX와 같은
유틸 메서드를 사용해서 불변 Collection 객체를 만듬
◦ 그러나 그 메서드들을 이용한 방법은 지루하고 장황
◦ 그 단점을 없애기 위해서 새로운 팩토리 메서드를 추가.
4
 List와 Set 인터페이스
◦ "of" 메서드는 불변의 비어있거나 비어있지 않은 List 또는 Set을 만들어줌
 Empty List Example
 Non-Empty List Example
5
List immutableList = List.of();
List immutableList = List.of("one","two","three");
 Map 인터페이스
◦ "of ", "ofEntires “ 메서드
◦ 불변 Map 객체나 불변 Map.Entry 객체를 만듬
 Empty Map Example
 Non-Empty Map Example
6
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
 Java8에서 Default와 Static 메서드를 이용해서 인터페이스에 구현체를 넣는 방법이
추가됨
 하지만 private으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었음
7
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
 자바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
 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;
}
10
 자바9에서 프로세스 API를 개선함
 다음과 같은 두 커플 형태의 신규 클래스가 추가되었다.
◦ OS 프로세스를 관리 및 컨트롤할 있음
 java.lang.ProcessHandle
 java.lang.ProcessHandle.Info
 Process API Example
11
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Id: = " + currentProcess.getPid());
 자바 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());
}
}
 자바8에서 CompletableFuture가 가지는 문제점을 개선
 delayedExecutor()은 static 유틸 메서드로 사용
 주어진 시간 딜레이 이후에 기본 실행자로 보내진 new Executor를 반환
13
Executor exe =
CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
 리액티브 프로그래밍은 큰 인기를 끌고 있음
 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
 자바 7에서 Diamond Operator를 추가했지만,
자바 8에서 익명 내부 클래스 사용시 한계가 있다는 것을 확인
 해당 이슈를 수정하였고 아래와 같은 예를 들 수 있다.
 자세한 타입 파라미터 없이 단순히 "List"만을 사용하였지만 상세한 타입을 알아서 확
인해서 읽고 처리함
15
public List getEmployee(String empid){
// Code to get Employee details from Data Store
return new List(emp){ };
}
 Optional 클래스에 신규 메서드를 추가
 값이 Optional 객체로 주어질 때 Stream 메서드는 값과 함께 sequential stream을
리턴, 값이 비어 있다면 빈 스트림을 리턴함
 다음은 Optional에서 stream의 사용 형태를 보여준다.
 위 Optional.stream 메서드는 Employee 객체의 Optional 스트림을 Employee 객
체 스트림으로 변환해줌
16
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
 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
 자바8과 이전 버전에서 @Deprecated 어느테이션
◦ 어떤 메서드도 없이 단순히 마커 인터페이스
 Java SE 9에서 Oracle Corporation은 @Deprecated 주석을 강화
◦ 지원 중단 된 API에 대한 자세한 정보를 제공
◦ 지원 중단 된 API의 정적 사용을 분석하는 도구를 제공
 forRemoval고 since가 추가됨 (정보 제공)
18
 추가 배경
◦ 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
 Java SE 9에서 새로운 multi-Resolution Image API를 도입 예정
 이 API의 중요한 인터페이스는 MultiResolutionImage
 java.awt.image 패키지로 이용 가능
 MultiResolutionImage
◦ 서로 다른 높이와 너비 (해상도가 다름)의 이미지 세트를 캡슐화
◦ 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록 함
20
 기타 특징 (덜 중요한 특징은 아님)
◦ 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
1. Java9 Features
(http://www.journaldev.com/13121/java-9-features-with-examples)
22

More Related Content

자바9 특징 (Java9 Features)

  • 1. JAVA 9 Features 한창환 (Chang-Hwan Han) atin84@gmail.com
  • 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");
  • 6.  Map 인터페이스 ◦ "of ", "ofEntires “ 메서드 ◦ 불변 Map 객체나 불변 Map.Entry 객체를 만듬  Empty Map Example  Non-Empty Map Example 6 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으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었음 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; }
  • 10. 10
  • 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