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 가 자바를 실행
14. JAVA EE 7 요약
개발자 생산성
기업의 요구
사항
충족
Java EE 7
POJO 를 위한 좀
더 다양한
annotation 지원
코드 단순화
더욱 쉬워진 통합
WebSockets
JSON
Servlet 3.1 NIO
REST
Batch
Concurrency
단순화 된 JMS API
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);
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 의 효과 검증
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);
}
}
}
43. TYPE ANNOTATION
• Operator 나 변수, throws 구문 등에 type 지정
이 가능
• 실제 Checking 을 위해서는 별도의 Type
Checking Framework 이 필요
• Washington University – Checker Framework
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 의 번들 사이즈
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