SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
Java 8 & Beyond
이창재(changjae.lee@oracle.com)
Senior Architect
STAr team, Oracle APAC
The preceding material is intended to outline our general p
roduct direction. It is intended for information purposes onl
y, and may not be incorporated into any contract. It is not a
commitment to deliver any material, code, or functionality,
and should not be relied upon in making purchasing decisi
ons. The development, release, and timing of any features
or functionality described for Oracle’s products remains at
the sole discretion of Oracle.
개발자 선호도 1등
1위 개발 플랫폼
전세계 Top 5 OEM 회사 모두가 Java
ME 를 OEM
3백억 모바일폰이 자바를 탑재
블루레이 플레이어의 100% 가 자바
탑재
기업용 데스크탑의 97%가 자바 실행
미국 데스크탑의 89%가 자바를 실행
5백억의 자바 카드가 현재 사용 중
1억2천5백만개의 TV 가 자바를 실행
On
9,000,000
전 세계 자바 개발자
Java EE Compliant 한 18 개의 어플리케이션 서버
Java 7 Recap
JSR 334: PROJECT COIN

그림출처 http://blogimg.ohmynews.com/attach/26182/1139556367.jpg
JSR 334: PROJECT COIN IN ONE SLIDE
byte literalByte = (byte)0b0101010101;
byte literalByte2 = (byte)0b1010_1010_1010;
HashMap<Date, String> aMap = new HashMap<>();
switch (condition) {
case "January":
default:
}
try (InputStream in = new FileInputStream(src)) {
}
catch (SecurityException | IOException ex) {
}
JSR 292: INVOKEDYNAMIC

Smalltalk

Groovy
Java 8 (!)

JRuby

Javascript

PHP.rebo
ot
Mirah
Jython

기타 등등 더 많은 언어들 http://en.wikipedia.org/wiki/List_of_JVM_languages
JSR 166 FORK/JOIN
•Doug Lea
( java.util.concurrent)
•분할 정복 알고리즘
•작업을 최대한 병렬로 쪼
개서 처리
NIO 2

• Async Channel API 지원
• File - AsynchronousFileChannel
• Network – AsynchronousSocketChannel, Asynchron
ousServerSocketChannel

• java.nio.file.Files, java.nio.file.Paths, Interfa
ce java.nio.file.Path
• Symbolic link 지원
• FileVisitor, WatchService
GARBAGE 1 COLLECTOR
JAVA EE 7 요약

개발자 생산성

기업의 요구
사항
충족

Java EE 7

 POJO 를 위한 좀
더 다양한
annotation 지원
 코드 단순화
 더욱 쉬워진 통합

 WebSockets
 JSON
 Servlet 3.1 NIO
 REST

 Batch
 Concurrency
 단순화 된 JMS API
2014년 3월
Hello Java 8!
JAVA VERSION HISTORY
J2SE1.4
•RegEx
•NIO
•Logging
•XML

J2SE1.2
•Swing
•Collection

J2SE6
•Rhino
•JAXWS
•JDBC4.0

JDK1.0
Hello World!
1996

1998

JDK1.1
•JIT
•RMI
•JDBC

2000

2000

J2SE1.3
•Hotspot
•JNDI

2002

2004

J2SE5.0
•GENERIC
•Concurrency
•Annotation

2006

2011

J2SE7
•Project Coin
•invokedynamic
•NIO2
•G1 GC
J2SE 8 새로운 기능

•
•
•
•
•
•
•
•
•

Interface
JSR335: Lambda Expression
Stream API
JSR310: Time and Date API
Type, Repeating Annotation
JDK Convergence
Compact Profile
Project Nashorn
Java RoadMap
INTERFACE – JAVA.UTIL.COMPARATOR
@FunctionalInterface

public interface Comparator<T> {

int compare(T o1, T o2);
boolean equals(Object obj);

default Comparator<T> reversed() {
}
.......

return Collections.reverseOrder(this);

public static<T> Comparator<T> comparingDouble
(ToDoubleFunction<? super T> keyExtractor) {
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> Double.compare(keyExtractor.applyAsDou
ble(c1), keyExtractor.applyAsDouble(c2));
}
.......
}
INTERFACE 의 확장
• Interface 에 static method implementation 가
능
• default method
• 인터페이스에 abstract 메소드 추가시??

• @FunctionalInterface - Lambda
FUNCTIONAL INTERFACE
• 오직 하나만의 abstract method 를 가지고 있는
Interface
• 대표적으로 Runnable, ActionListener, Comparator

new Thread(new Runnable() {
public void run() {
System.out.println("Thread run!!");
}
}).run();
JSR 335: LAMBDA EXPRESSION
•
•
•
•

Major 언어 중에서도 거의 마지막으로 Clojure지원
‘Code as a data’ 개념
내부적으로 invokedynamic 을 활용
Lambda 는 Functional Interface 의 Instance
• Lambda 구문
매개변수 목록

화살표 토큰

구현

(int x, int y)

->

x + y
JSR 335: LAMBDA EXPRESSION
• Lambda 구문 예제
(int x, int y) -> x + y
(int x, int y) -> { system.out.println(x + y);}

x, y -> x + y

//Comparator
Collections.sort(personList, (p1, p2) -> p1.fir
stName.compareTo(p2.firstName));
//Runnable
Runnable r = () -> {
System.out.println("Thread run!!"); }
JSR 335: LAMBDA EXPRESSION
• Built-in Lambda Type ( java.util.interface 패키지)
• Predicate: true/false 를 리턴
• Consumer: 변수로 받은 오브젝트에 작업을 수행. 결
과 값을 리턴 하지 않음
• Function<T,U>: T 를 받아서 작업을 수행 후 U 를
리턴
• Supplier: T 의 인스턴스(대표적으로 팩토리)
• UnaryOperator: 단항 연산자
• BinaryOperator : 다항 연산자
JSR 335: LAMBDA EXPRESSION-PREDICATE
Predicate<Person> allDrivers =
p -> p.getAge() >= 16;
public void phoneContacts(List<Person> pl, Pre
dicate<Person> pred){
for(Person p:pl){
if (pred.test(p)){
roboCall(p);
}
}
}
phoneContacts(personList, allDrivers);
JSR 335: LAMBDA EXPRESSION-FUNCTION
public String printCustom(Function <Person, String> f){
return f.apply(this);
}
Function<Person, String> westernStyle = p -> {
return "nName: " + p.getGivenName() + " " + p.getSurName() +
"n" +"Age: " + p.getAge() + " " + "Gender: " + p.getGender(
) + "n" +"EMail: " + p.getEmail() + "n" + "Phone: " + p.get
Phone() + "n" + "Address: " + p.getAddress(); };
System.out.println("n===Western List===");
for (Person person:list1){
System.out.println(person.printCustom(westernStyle));
}
STREAM API
Java 8 이전
Iterator iter = widgets.Iterator();
int sumOfWeights = 0;
for(Iterator iter = widgets.iterator();iter.hasNext
();) {
Widget widget= (Widget)iter.next();
sumOfWeights += widget.getWeight();

}
Java 8
int sumOfWeights
= widgets.stream().filter(b -> b.getColor() == RED)
.mapToInt(b -> b.getWeight())
.sum();
STREAM API

출처 http://www.eaipatterns.com/PipesAndFilters.html

• Iterator+ for or while vs stream()
• Pipe and Filter Design Pattern
• 두 가지의 Operator
• Intermediate Operator
• Final Operator
STREAM API – INTERMEDIATE OPERATOR
• Stream 을 받아서 Stream 을 돌려줌
• Stateful, Stateless 두 종류로 나뉨
• Stateless : map, filter 등
• Stateful : sorted, distnct 등
Operator

Description/Content

map

• Function 을 이용하여 Element Type 을 변경

filter

• Predicate 을 이용하여 Element Filtering

flatMap

• Function 이 apply 된 결과 Element 들의 Stream

sorted

• 정렬

distinct

• Distinct Element
STREAM API – TERMINAL OPERATOR
• Stream 을 받아서 최종 결과 계산
• Terminal Operator 가 실제 계산을 시작. Intermediate
는 lazy 방식으로 동작
Operator

Description/Content

forEach

• Stream 의 각각의 Element 에 action 을 취함

toArray

• Stream 을 Array 로 복사

collect

• Stream 을 Map 혹은 Collection 으로 복사

min/max

• Comparator 를 이용 최대/최소 찾기

anyMatch

• Predicate 에 맞는 Element 찾기 – short-circuiting
STREAM API – PARALLEL STREAM
•
•
•
•

Collection.parallelStream()
Fork/Join Framework 사용
Thread pool 은 ForkJoinPool
Parallelism 의 효과 검증
그림출처 http://beyondbabedom.com/maxington/wp-content/uploads/2013/02/watch-with-hammer.jpg
시대에 뒤떨어지는 API
• Mutable
• 낮은 Performance
• 왜 java.util.Calendar.January 는 0부터 시작하는
가
• Java 에게 1900 년도 이전은?
• 윤년
시대에 뒤떨어지는 API
java.util.Date API Doc
JSR310: TIME AND DATE API
• 완전히 새롭게 개발

• Spec Lead – Joda Time 개발자 (Stephane Coleburne)
• 새롭게 소개된 4개의 API
•java.util.LocalDate

•java.util.LocalTime
•java.util.LocalDateTime
•java.util.ZoneDateTime

• JDBC 4.2 에 반영
JSR310: TIME AND DATE API
LocalDate currentDate = LocalDate.now();
boolean isLeapYear = currentDate.isLeapYear();
LocalDate date = LocalDate.of(2014, Month.FEBRUARY,
12);
LocalTime currentTime = LocalTime.now();
LocalDateTime currentDateTime = LocalDateTime.now();
currentDateTime = LocalDateTime.of(2014, 2, 21, 13,
40);
date = currentDateTime.plusMonths(1).minusDays(3);
JSR310: TIME AND DATE API - TIMEZONE
• ZonedDateTime
• 내부적으로 3개의 정보를 가짐

• LocalDateTime
• ZoneId
• ZoneOffset
• Zone Id : “Europe/London”, “Asia/Seoul”
• Zone Offset : GMT -18:00 ~ +18:00
• Seoul -> GMT + 09:00
PROJECT NASHORN
PROJECT NASHORN
• NASHORN 은 독일어로 “Rhino”
• Nestcape in 1997
• Project Nashorn 은 Invokedynamic 의
POC(Proof of Concept) 로 javascript 가 선정 되
면서 탄생
• ECMAScript 5.1 spec
• Java SE 8, ME 8 에 포함
PROJECT NASHORN
import javax.script.*;

public class Nashorn {
public static void main(String[] args) {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine e = m.getEngineByName("nashorn");
try {
e.put("x", 10);
e.put("y", 20);
e.eval("var z = x + y;");
System.out.println(((Number) e.get("z")).intValue());
} catch (final ScriptException ex) {
System.err.println(ex);
}
}
}
PROJECT NASHORN
• jjs command line Tool 제공
PROJECT NASHORN
• ShellScripting
TYPE ANNOTATION
@NotNull String str1 = ...
@Email String str2 = ...
@NotNull @NotBlank String str3 = ...
Map.@NonNull Entry = ...
myString = (@NonNull String) myObject;
void monitorTemperature() throws @Critical T
emperatureException { ... }
void authenticate() throws @Fatal @Logged Ac
cessDeniedException { ... }
TYPE ANNOTATION
• Operator 나 변수, throws 구문 등에 type 지정
이 가능
• 실제 Checking 을 위해서는 별도의 Type
Checking Framework 이 필요
• Washington University – Checker Framework
REPEATING ANNOTATION
• java.lang.annotation.Repeatable
• 중복 Annotation 지정 허용
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
JDK CONVERGENCE
•
•
•
•

JRockit + Hotspot
Java Mission Control, Flight Recorder
Permgen 제거
JRockit Real Time Deterministic GC
JDK CONVERGENCE
Java Mission Control(JDK7U40+)
PERMANENT GENERATION 제거
• string pool 은 Java 7 에서 Heap 영역으로 이동
• Class 정보는 Metaspace 라는 Native Memory 영역으로
이동 됨
• Virtual Memory 가 허용하는 한 최대한 할당 가능
• MaxMetaspaceSize로 사이즈 조정 가능
• Garbage Collection
• Permanent 에 저장되던 일부 데이타들이 heap 으로 옮
겨서 저장됨으로써 메모리 사용량이 증가 할 수 있음
JAVA SE COMPACT PROFILE
• Java SE 와 ME Convergence 발표 - JavaOne
2013
• Java SE 와 CDC 의 통합  Java SE Compact
Profile
• Compact 1 ~ 3

• Embedded Compact Profile
• JRE Customization
• Rasberry Pi 등의 지원
• 최소 3MB 의 번들 사이즈
Beyond Java 8
Java 8
Features

Beyond
Java 8

• Lambda -- JSR 335

• Modular Platform (Jigsaw)

• Date & Time API -- JSR 310

• Unified Type System

• Nashorn JavaScript Engine

• Language Interoperability

• Compact Profiles

• Memory-efficient data structures

• Security Enhancements

• Java on GPUs (Sumatra)
PROJECT JIGSAW
현재의 JAVA
APIs
Java SE 7

Language
Java SE 7

CDC 1.1
CDC 1.1
CLDC 1.1

(based on SE 1.4.2)

CLDC 1.1
(based on SE 1.3)
JAVA 8
APIs
Java SE 8

Java ME 8

Language
Java SE 8

Java ME 8
BEYOND JAVA 8
APIs

Language

Java SE

Java SE

Small
Devices

Small Device
s
JAVA ROADMAP
7u21
• 클라이언트 보안
강화
• 앱스토어 패키징
툴

7u40
• Java Flight Recorder
• Java Mission Control
• Java Discovery Protocol
• Native memory trackin
g
• Local Security Policy

2013

Java ME Embedded 3.4
• Fast follow-on
• QSC platform only
• 온디바이스 모니터링,
디버깅 지원

JDK 8 (Q1 2014)
• Lambda
• JVM Convergence
• JavaScript Interop
• JavaFX 8

2014

Java ME Embedded 8
• Java ME CLDC 8 & ME
Embedded Profile 8
• “Little sibling” of Java S
E8
• New & enhanced Emb
edded API
• New portable architect
ure

JDK 9
• Modularity – Jigsaw
• Interoperability
• Cloud
• Ease of Use
• Optimizations

2015

Java SE Embedded 8
• JVM 통합 완료
• Compact Profiles
• Support for ARM, Power P
C & x86
• Java Flight Recorder/Missi
on Control
• Simple migration of ME C
DC headless applications

2016

Java Embedded 9
• Java ME and SE 9
• Modularity based
on Jigsaw
감사합니다.

Mais conteúdo relacionado

Destaque

Our community design project
Our community design projectOur community design project
Our community design projectmaynelindsay
 
JavaEE6 - 설계 차원의 단순성
JavaEE6 - 설계 차원의 단순성JavaEE6 - 설계 차원의 단순성
JavaEE6 - 설계 차원의 단순성Jay Lee
 
Jada 2003-vernillo-24 s-33s
Jada 2003-vernillo-24 s-33sJada 2003-vernillo-24 s-33s
Jada 2003-vernillo-24 s-33sMabel Salas
 
Java EE7
Java EE7Java EE7
Java EE7Jay Lee
 
CF Korea Meetup - Gemfire on PCF
CF Korea Meetup - Gemfire on PCF CF Korea Meetup - Gemfire on PCF
CF Korea Meetup - Gemfire on PCF Jay Lee
 

Destaque (6)

Our community design project
Our community design projectOur community design project
Our community design project
 
JavaEE6 - 설계 차원의 단순성
JavaEE6 - 설계 차원의 단순성JavaEE6 - 설계 차원의 단순성
JavaEE6 - 설계 차원의 단순성
 
Jada 2003-vernillo-24 s-33s
Jada 2003-vernillo-24 s-33sJada 2003-vernillo-24 s-33s
Jada 2003-vernillo-24 s-33s
 
Java EE7
Java EE7Java EE7
Java EE7
 
La7836
La7836La7836
La7836
 
CF Korea Meetup - Gemfire on PCF
CF Korea Meetup - Gemfire on PCF CF Korea Meetup - Gemfire on PCF
CF Korea Meetup - Gemfire on PCF
 

Semelhante a Java 8 & Beyond

overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본Tj .
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020Ji-Woong Choi
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석uEngine Solutions
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Introduction to Apache Tajo
Introduction to Apache TajoIntroduction to Apache Tajo
Introduction to Apache TajoGruter
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개Sungchul Park
 
IT 서비스 개발 15년 _ IT service 15 years
IT 서비스 개발 15년 _ IT service 15 yearsIT 서비스 개발 15년 _ IT service 15 years
IT 서비스 개발 15년 _ IT service 15 years연지 김
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기Ted Won
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅NAVER D2
 
Tomcat 마이그레이션 도전하기 (Jins Choi)
Tomcat 마이그레이션 도전하기 (Jins Choi)Tomcat 마이그레이션 도전하기 (Jins Choi)
Tomcat 마이그레이션 도전하기 (Jins Choi)삵 (sarc.io)
 

Semelhante a Java 8 & Beyond (20)

overview of spring4
overview of spring4overview of spring4
overview of spring4
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
React native 개발 및 javascript 기본
React native 개발 및 javascript 기본React native 개발 및 javascript 기본
React native 개발 및 javascript 기본
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Eclipse RAP
Eclipse RAPEclipse RAP
Eclipse RAP
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Spark sql
Spark sqlSpark sql
Spark sql
 
Introduction to Apache Tajo
Introduction to Apache TajoIntroduction to Apache Tajo
Introduction to Apache Tajo
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개
 
IT 서비스 개발 15년 _ IT service 15 years
IT 서비스 개발 15년 _ IT service 15 yearsIT 서비스 개발 15년 _ IT service 15 years
IT 서비스 개발 15년 _ IT service 15 years
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
 
Scala for play
Scala for playScala for play
Scala for play
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
 
Tomcat 마이그레이션 도전하기 (Jins Choi)
Tomcat 마이그레이션 도전하기 (Jins Choi)Tomcat 마이그레이션 도전하기 (Jins Choi)
Tomcat 마이그레이션 도전하기 (Jins Choi)
 

Mais de Jay Lee

Spring on Kubernetes
Spring on KubernetesSpring on Kubernetes
Spring on KubernetesJay Lee
 
Knative And Pivotal Function As a Service
Knative And Pivotal Function As a ServiceKnative And Pivotal Function As a Service
Knative And Pivotal Function As a ServiceJay Lee
 
Knative and Riff
Knative and RiffKnative and Riff
Knative and RiffJay Lee
 
Spring5 New Features
Spring5 New FeaturesSpring5 New Features
Spring5 New FeaturesJay Lee
 
Reactive Microservice And Spring5
Reactive Microservice And Spring5Reactive Microservice And Spring5
Reactive Microservice And Spring5Jay Lee
 
CF Korea Meetup - Spring Cloud Services
CF Korea Meetup - Spring Cloud ServicesCF Korea Meetup - Spring Cloud Services
CF Korea Meetup - Spring Cloud ServicesJay Lee
 
SpringCamp 2016 - Apache Geode 와 Spring Data Gemfire
SpringCamp 2016 - Apache Geode 와 Spring Data GemfireSpringCamp 2016 - Apache Geode 와 Spring Data Gemfire
SpringCamp 2016 - Apache Geode 와 Spring Data GemfireJay Lee
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJay Lee
 

Mais de Jay Lee (8)

Spring on Kubernetes
Spring on KubernetesSpring on Kubernetes
Spring on Kubernetes
 
Knative And Pivotal Function As a Service
Knative And Pivotal Function As a ServiceKnative And Pivotal Function As a Service
Knative And Pivotal Function As a Service
 
Knative and Riff
Knative and RiffKnative and Riff
Knative and Riff
 
Spring5 New Features
Spring5 New FeaturesSpring5 New Features
Spring5 New Features
 
Reactive Microservice And Spring5
Reactive Microservice And Spring5Reactive Microservice And Spring5
Reactive Microservice And Spring5
 
CF Korea Meetup - Spring Cloud Services
CF Korea Meetup - Spring Cloud ServicesCF Korea Meetup - Spring Cloud Services
CF Korea Meetup - Spring Cloud Services
 
SpringCamp 2016 - Apache Geode 와 Spring Data Gemfire
SpringCamp 2016 - Apache Geode 와 Spring Data GemfireSpringCamp 2016 - Apache Geode 와 Spring Data Gemfire
SpringCamp 2016 - Apache Geode 와 Spring Data Gemfire
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
 

Java 8 & Beyond

  • 1. Java 8 & Beyond 이창재(changjae.lee@oracle.com) Senior Architect STAr team, Oracle APAC
  • 2. The preceding material is intended to outline our general p roduct direction. It is intended for information purposes onl y, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisi ons. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
  • 3. 개발자 선호도 1등 1위 개발 플랫폼 전세계 Top 5 OEM 회사 모두가 Java ME 를 OEM 3백억 모바일폰이 자바를 탑재 블루레이 플레이어의 100% 가 자바 탑재 기업용 데스크탑의 97%가 자바 실행 미국 데스크탑의 89%가 자바를 실행 5백억의 자바 카드가 현재 사용 중 1억2천5백만개의 TV 가 자바를 실행
  • 4. On
  • 5.
  • 6. 9,000,000 전 세계 자바 개발자 Java EE Compliant 한 18 개의 어플리케이션 서버
  • 8. JSR 334: PROJECT COIN 그림출처 http://blogimg.ohmynews.com/attach/26182/1139556367.jpg
  • 9. JSR 334: PROJECT COIN IN ONE SLIDE byte literalByte = (byte)0b0101010101; byte literalByte2 = (byte)0b1010_1010_1010; HashMap<Date, String> aMap = new HashMap<>(); switch (condition) { case "January": default: } try (InputStream in = new FileInputStream(src)) { } catch (SecurityException | IOException ex) { }
  • 10. JSR 292: INVOKEDYNAMIC Smalltalk Groovy Java 8 (!) JRuby Javascript PHP.rebo ot Mirah Jython 기타 등등 더 많은 언어들 http://en.wikipedia.org/wiki/List_of_JVM_languages
  • 11. JSR 166 FORK/JOIN •Doug Lea ( java.util.concurrent) •분할 정복 알고리즘 •작업을 최대한 병렬로 쪼 개서 처리
  • 12. NIO 2 • Async Channel API 지원 • File - AsynchronousFileChannel • Network – AsynchronousSocketChannel, Asynchron ousServerSocketChannel • java.nio.file.Files, java.nio.file.Paths, Interfa ce java.nio.file.Path • Symbolic link 지원 • FileVisitor, WatchService
  • 14. JAVA EE 7 요약 개발자 생산성 기업의 요구 사항 충족 Java EE 7  POJO 를 위한 좀 더 다양한 annotation 지원  코드 단순화  더욱 쉬워진 통합  WebSockets  JSON  Servlet 3.1 NIO  REST  Batch  Concurrency  단순화 된 JMS API
  • 16. JAVA VERSION HISTORY J2SE1.4 •RegEx •NIO •Logging •XML J2SE1.2 •Swing •Collection J2SE6 •Rhino •JAXWS •JDBC4.0 JDK1.0 Hello World! 1996 1998 JDK1.1 •JIT •RMI •JDBC 2000 2000 J2SE1.3 •Hotspot •JNDI 2002 2004 J2SE5.0 •GENERIC •Concurrency •Annotation 2006 2011 J2SE7 •Project Coin •invokedynamic •NIO2 •G1 GC
  • 17. J2SE 8 새로운 기능 • • • • • • • • • Interface JSR335: Lambda Expression Stream API JSR310: Time and Date API Type, Repeating Annotation JDK Convergence Compact Profile Project Nashorn Java RoadMap
  • 18. INTERFACE – JAVA.UTIL.COMPARATOR @FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); default Comparator<T> reversed() { } ....... return Collections.reverseOrder(this); public static<T> Comparator<T> comparingDouble (ToDoubleFunction<? super T> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator<T> & Serializable) (c1, c2) -> Double.compare(keyExtractor.applyAsDou ble(c1), keyExtractor.applyAsDouble(c2)); } ....... }
  • 19. INTERFACE 의 확장 • Interface 에 static method implementation 가 능 • default method • 인터페이스에 abstract 메소드 추가시?? • @FunctionalInterface - Lambda
  • 20. FUNCTIONAL INTERFACE • 오직 하나만의 abstract method 를 가지고 있는 Interface • 대표적으로 Runnable, ActionListener, Comparator new Thread(new Runnable() { public void run() { System.out.println("Thread run!!"); } }).run();
  • 21. JSR 335: LAMBDA EXPRESSION • • • • Major 언어 중에서도 거의 마지막으로 Clojure지원 ‘Code as a data’ 개념 내부적으로 invokedynamic 을 활용 Lambda 는 Functional Interface 의 Instance • Lambda 구문 매개변수 목록 화살표 토큰 구현 (int x, int y) -> x + y
  • 22. JSR 335: LAMBDA EXPRESSION • Lambda 구문 예제 (int x, int y) -> x + y (int x, int y) -> { system.out.println(x + y);} x, y -> x + y //Comparator Collections.sort(personList, (p1, p2) -> p1.fir stName.compareTo(p2.firstName)); //Runnable Runnable r = () -> { System.out.println("Thread run!!"); }
  • 23. JSR 335: LAMBDA EXPRESSION • Built-in Lambda Type ( java.util.interface 패키지) • Predicate: true/false 를 리턴 • Consumer: 변수로 받은 오브젝트에 작업을 수행. 결 과 값을 리턴 하지 않음 • Function<T,U>: T 를 받아서 작업을 수행 후 U 를 리턴 • Supplier: T 의 인스턴스(대표적으로 팩토리) • UnaryOperator: 단항 연산자 • BinaryOperator : 다항 연산자
  • 24. JSR 335: LAMBDA EXPRESSION-PREDICATE Predicate<Person> allDrivers = p -> p.getAge() >= 16; public void phoneContacts(List<Person> pl, Pre dicate<Person> pred){ for(Person p:pl){ if (pred.test(p)){ roboCall(p); } } } phoneContacts(personList, allDrivers);
  • 25. JSR 335: LAMBDA EXPRESSION-FUNCTION public String printCustom(Function <Person, String> f){ return f.apply(this); } Function<Person, String> westernStyle = p -> { return "nName: " + p.getGivenName() + " " + p.getSurName() + "n" +"Age: " + p.getAge() + " " + "Gender: " + p.getGender( ) + "n" +"EMail: " + p.getEmail() + "n" + "Phone: " + p.get Phone() + "n" + "Address: " + p.getAddress(); }; System.out.println("n===Western List==="); for (Person person:list1){ System.out.println(person.printCustom(westernStyle)); }
  • 26. STREAM API Java 8 이전 Iterator iter = widgets.Iterator(); int sumOfWeights = 0; for(Iterator iter = widgets.iterator();iter.hasNext ();) { Widget widget= (Widget)iter.next(); sumOfWeights += widget.getWeight(); } Java 8 int sumOfWeights = widgets.stream().filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum();
  • 27. STREAM API 출처 http://www.eaipatterns.com/PipesAndFilters.html • Iterator+ for or while vs stream() • Pipe and Filter Design Pattern • 두 가지의 Operator • Intermediate Operator • Final Operator
  • 28. STREAM API – INTERMEDIATE OPERATOR • Stream 을 받아서 Stream 을 돌려줌 • Stateful, Stateless 두 종류로 나뉨 • Stateless : map, filter 등 • Stateful : sorted, distnct 등 Operator Description/Content map • Function 을 이용하여 Element Type 을 변경 filter • Predicate 을 이용하여 Element Filtering flatMap • Function 이 apply 된 결과 Element 들의 Stream sorted • 정렬 distinct • Distinct Element
  • 29. STREAM API – TERMINAL OPERATOR • Stream 을 받아서 최종 결과 계산 • Terminal Operator 가 실제 계산을 시작. Intermediate 는 lazy 방식으로 동작 Operator Description/Content forEach • Stream 의 각각의 Element 에 action 을 취함 toArray • Stream 을 Array 로 복사 collect • Stream 을 Map 혹은 Collection 으로 복사 min/max • Comparator 를 이용 최대/최소 찾기 anyMatch • Predicate 에 맞는 Element 찾기 – short-circuiting
  • 30. STREAM API – PARALLEL STREAM • • • • Collection.parallelStream() Fork/Join Framework 사용 Thread pool 은 ForkJoinPool Parallelism 의 효과 검증
  • 32. 시대에 뒤떨어지는 API • Mutable • 낮은 Performance • 왜 java.util.Calendar.January 는 0부터 시작하는 가 • Java 에게 1900 년도 이전은? • 윤년
  • 34. JSR310: TIME AND DATE API • 완전히 새롭게 개발 • Spec Lead – Joda Time 개발자 (Stephane Coleburne) • 새롭게 소개된 4개의 API •java.util.LocalDate •java.util.LocalTime •java.util.LocalDateTime •java.util.ZoneDateTime • JDBC 4.2 에 반영
  • 35. JSR310: TIME AND DATE API LocalDate currentDate = LocalDate.now(); boolean isLeapYear = currentDate.isLeapYear(); LocalDate date = LocalDate.of(2014, Month.FEBRUARY, 12); LocalTime currentTime = LocalTime.now(); LocalDateTime currentDateTime = LocalDateTime.now(); currentDateTime = LocalDateTime.of(2014, 2, 21, 13, 40); date = currentDateTime.plusMonths(1).minusDays(3);
  • 36. JSR310: TIME AND DATE API - TIMEZONE • ZonedDateTime • 내부적으로 3개의 정보를 가짐 • LocalDateTime • ZoneId • ZoneOffset • Zone Id : “Europe/London”, “Asia/Seoul” • Zone Offset : GMT -18:00 ~ +18:00 • Seoul -> GMT + 09:00
  • 38. PROJECT NASHORN • NASHORN 은 독일어로 “Rhino” • Nestcape in 1997 • Project Nashorn 은 Invokedynamic 의 POC(Proof of Concept) 로 javascript 가 선정 되 면서 탄생 • ECMAScript 5.1 spec • Java SE 8, ME 8 에 포함
  • 39. PROJECT NASHORN import javax.script.*; public class Nashorn { public static void main(String[] args) { ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine e = m.getEngineByName("nashorn"); try { e.put("x", 10); e.put("y", 20); e.eval("var z = x + y;"); System.out.println(((Number) e.get("z")).intValue()); } catch (final ScriptException ex) { System.err.println(ex); } } }
  • 40. PROJECT NASHORN • jjs command line Tool 제공
  • 42. TYPE ANNOTATION @NotNull String str1 = ... @Email String str2 = ... @NotNull @NotBlank String str3 = ... Map.@NonNull Entry = ... myString = (@NonNull String) myObject; void monitorTemperature() throws @Critical T emperatureException { ... } void authenticate() throws @Fatal @Logged Ac cessDeniedException { ... }
  • 43. TYPE ANNOTATION • Operator 나 변수, throws 구문 등에 type 지정 이 가능 • 실제 Checking 을 위해서는 별도의 Type Checking Framework 이 필요 • Washington University – Checker Framework
  • 44. REPEATING ANNOTATION • java.lang.annotation.Repeatable • 중복 Annotation 지정 허용 @Schedule(dayOfMonth="last") @Schedule(dayOfWeek="Fri", hour="23") public void doPeriodicCleanup() { ... }
  • 45. JDK CONVERGENCE • • • • JRockit + Hotspot Java Mission Control, Flight Recorder Permgen 제거 JRockit Real Time Deterministic GC
  • 46. JDK CONVERGENCE Java Mission Control(JDK7U40+)
  • 47. PERMANENT GENERATION 제거 • string pool 은 Java 7 에서 Heap 영역으로 이동 • Class 정보는 Metaspace 라는 Native Memory 영역으로 이동 됨 • Virtual Memory 가 허용하는 한 최대한 할당 가능 • MaxMetaspaceSize로 사이즈 조정 가능 • Garbage Collection • Permanent 에 저장되던 일부 데이타들이 heap 으로 옮 겨서 저장됨으로써 메모리 사용량이 증가 할 수 있음
  • 48. JAVA SE COMPACT PROFILE • Java SE 와 ME Convergence 발표 - JavaOne 2013 • Java SE 와 CDC 의 통합  Java SE Compact Profile • Compact 1 ~ 3 • Embedded Compact Profile • JRE Customization • Rasberry Pi 등의 지원 • 최소 3MB 의 번들 사이즈
  • 50. Java 8 Features Beyond Java 8 • Lambda -- JSR 335 • Modular Platform (Jigsaw) • Date & Time API -- JSR 310 • Unified Type System • Nashorn JavaScript Engine • Language Interoperability • Compact Profiles • Memory-efficient data structures • Security Enhancements • Java on GPUs (Sumatra)
  • 52. 현재의 JAVA APIs Java SE 7 Language Java SE 7 CDC 1.1 CDC 1.1 CLDC 1.1 (based on SE 1.4.2) CLDC 1.1 (based on SE 1.3)
  • 53. JAVA 8 APIs Java SE 8 Java ME 8 Language Java SE 8 Java ME 8
  • 54. BEYOND JAVA 8 APIs Language Java SE Java SE Small Devices Small Device s
  • 55. JAVA ROADMAP 7u21 • 클라이언트 보안 강화 • 앱스토어 패키징 툴 7u40 • Java Flight Recorder • Java Mission Control • Java Discovery Protocol • Native memory trackin g • Local Security Policy 2013 Java ME Embedded 3.4 • Fast follow-on • QSC platform only • 온디바이스 모니터링, 디버깅 지원 JDK 8 (Q1 2014) • Lambda • JVM Convergence • JavaScript Interop • JavaFX 8 2014 Java ME Embedded 8 • Java ME CLDC 8 & ME Embedded Profile 8 • “Little sibling” of Java S E8 • New & enhanced Emb edded API • New portable architect ure JDK 9 • Modularity – Jigsaw • Interoperability • Cloud • Ease of Use • Optimizations 2015 Java SE Embedded 8 • JVM 통합 완료 • Compact Profiles • Support for ARM, Power P C & x86 • Java Flight Recorder/Missi on Control • Simple migration of ME C DC headless applications 2016 Java Embedded 9 • Java ME and SE 9 • Modularity based on Jigsaw