java 8 & beyond
DESCRIPTION
Presented at JCO Conference 2014TRANSCRIPT
![Page 1: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/1.jpg)
Java 8 & Beyond 이창재([email protected]) Senior Architect STAr team, Oracle APAC
![Page 2: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/2.jpg)
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.
![Page 3: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/3.jpg)
전세계 Top 5 OEM 회사 모두가 Java ME 를 OEM
1위 개발 플랫폼
3백억 모바일폰이 자바를 탑재
개발자 선호도 1등
블루레이 플레이어의 100% 가 자바 탑재 기업용 데스크탑의 97%가 자바 실행
미국 데스크탑의 89%가 자바를 실행
5백억의 자바 카드가 현재 사용 중
1억2천5백만개의 TV 가 자바를 실행
![Page 4: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/4.jpg)
On
![Page 5: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/5.jpg)
![Page 6: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/6.jpg)
9,000,000
전 세계 자바 개발자 Java EE Compliant 한 18 개의 어플리케이션 서버
![Page 7: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/7.jpg)
Java 7 Recap
![Page 8: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/8.jpg)
JSR 334: PROJECT COIN
그림출처 http://blogimg.ohmynews.com/attach/26182/1139556367.jpg
![Page 9: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/9.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) {
}
![Page 10: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/10.jpg)
Jython
JRuby Javascript
기타 등등 더 많은 언어들 - http://en.wikipedia.org/wiki/List_of_JVM_languages
Groovy
Mirah Java 8 (!)
PHP.reboot
Smalltalk
JSR 292: INVOKEDYNAMIC
![Page 11: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/11.jpg)
JSR 166 FORK/JOIN
•Doug Lea ( java.util.concurrent)
•분할 정복 알고리즘
•작업을 최대한 병렬로 쪼개서 처리
![Page 12: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/12.jpg)
NIO 2
• Async Channel API 지원 • File - AsynchronousFileChannel
• Network – AsynchronousSocketChannel, AsynchronousServerSocketChannel
• java.nio.file.Files, java.nio.file.Paths, Interface java.nio.file.Path
• Symbolic link 지원
• FileVisitor, WatchService
![Page 13: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/13.jpg)
GARBAGE 1 COLLECTOR
![Page 14: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/14.jpg)
JAVA EE 7 요약
Batch
Concurrency
단순화 된 JMS API
POJO 를 위한 좀
더 다양한
annotation 지원
코드 단순화
더욱 쉬워진 통합
개발자 생산성
WebSockets
JSON
Servlet 3.1 NIO
REST
기업의 요구사항 충족
Java EE 7
![Page 15: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/15.jpg)
2014년 3월 Hello Java 8!
![Page 16: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/16.jpg)
JAVA VERSION HISTORY
1996 2000 2004 2011
JDK1.0
Hello World!
JDK1.1
•JIT
•RMI
•JDBC
1998
J2SE1.2
•Swing
•Collection
J2SE1.3
•Hotspot
•JNDI
2000 2002
J2SE1.4
•RegEx
•NIO
•Logging
•XML
2006
J2SE5.0
•GENERIC
•Concurrency
•Annotation
J2SE6
•Rhino
•JAXWS
•JDBC4.0
J2SE7
•Project Coin
•invokedynamic
•NIO2
•G1 GC
![Page 17: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/17.jpg)
J2SE 8 새로운 기능
• Interface
• JSR335: Lambda Expression
• Stream API
• JSR310: Time and Date API
• Type, Repeating Annotation
• JDK Convergence
• Compact Profile
• Project Nashorn
• Java RoadMap
![Page 18: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/18.jpg)
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.applyAsDouble(c1), keyExtractor.applyAsDouble(c2)); } ....... }
![Page 19: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/19.jpg)
INTERFACE 의 확장
• Interface 에 static method implementation 가능
• default method
• 인터페이스에 abstract 메소드 추가시??
• @FunctionalInterface - Lambda
![Page 20: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/20.jpg)
FUNCTIONAL INTERFACE
• 오직 하나만의 abstract method 를 가지고 있는 Interface
• 대표적으로 Runnable, ActionListener, Comparator
new Thread(new Runnable() {
public void run() {
System.out.println("Thread run!!");
}
}).run();
![Page 21: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/21.jpg)
JSR 335: LAMBDA EXPRESSION
• Major 언어 중에서도 거의 마지막으로 Clojure지원
• ‘Code as a data’ 개념
• 내부적으로 invokedynamic 을 활용
• Lambda 는 Functional Interface 의 Instance
매개변수 목록 화살표 토큰 구현
(int x, int y) -> x + y
• Lambda 구문
![Page 22: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/22.jpg)
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!!"); }
![Page 23: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/23.jpg)
JSR 335: LAMBDA EXPRESSION
• Built-in Lambda Type ( java.util.interface 패키지)
• Predicate: true/false 를 리턴
• Consumer: 변수로 받은 오브젝트에 작업을 수행. 결
과 값을 리턴 하지 않음 • Function<T,U>: T 를 받아서 작업을 수행 후 U 를
리턴 • Supplier: T 의 인스턴스(대표적으로 팩토리) • UnaryOperator: 단항 연산자 • BinaryOperator : 다항 연산자
![Page 24: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/24.jpg)
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);
![Page 25: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/25.jpg)
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));
}
![Page 26: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/26.jpg)
STREAM API
Java 8 int sumOfWeights
= widgets.stream().filter(b -> b.getColor() == RED)
.mapToInt(b -> b.getWeight())
.sum();
Java 8 이전 Iterator iter = widgets.Iterator();
int sumOfWeights = 0;
for(Iterator iter = widgets.iterator();iter.hasNext
();) {
Widget widget= (Widget)iter.next();
sumOfWeights += widget.getWeight();
}
![Page 27: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/27.jpg)
STREAM API
• Iterator+ for or while vs stream()
• Pipe and Filter Design Pattern
• 두 가지의 Operator
• Intermediate Operator
• Final Operator
출처 http://www.eaipatterns.com/PipesAndFilters.html
![Page 28: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/28.jpg)
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
![Page 29: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/29.jpg)
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
![Page 30: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/30.jpg)
STREAM API – PARALLEL STREAM
• Collection.parallelStream()
• Fork/Join Framework 사용
• Thread pool 은 ForkJoinPool
• Parallelism 의 효과 검증
![Page 31: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/31.jpg)
그림출처 http://beyondbabedom.com/maxington/wp-content/uploads/2013/02/watch-with-hammer.jpg
![Page 32: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/32.jpg)
시대에 뒤떨어지는 API
• Mutable
• 낮은 Performance
• 왜 java.util.Calendar.January 는 0부터 시작하는가
• Java 에게 1900 년도 이전은?
• 윤년
![Page 33: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/33.jpg)
시대에 뒤떨어지는 API
java.util.Date API Doc
![Page 34: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/34.jpg)
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 에 반영
![Page 35: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/35.jpg)
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);
![Page 36: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/36.jpg)
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
![Page 37: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/37.jpg)
PROJECT NASHORN
![Page 38: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/38.jpg)
PROJECT NASHORN
• NASHORN 은 독일어로 “Rhino”
• Nestcape in 1997
• Project Nashorn 은 Invokedynamic 의 POC(Proof of Concept) 로 javascript 가 선정 되면서 탄생
• ECMAScript 5.1 spec
• Java SE 8, ME 8 에 포함
![Page 39: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/39.jpg)
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);
}
}
}
![Page 40: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/40.jpg)
PROJECT NASHORN
• jjs command line Tool 제공
![Page 41: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/41.jpg)
PROJECT NASHORN
• ShellScripting
![Page 42: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/42.jpg)
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 { ... }
![Page 43: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/43.jpg)
TYPE ANNOTATION
• Operator 나 변수, throws 구문 등에 type 지정이 가능
• 실제 Checking 을 위해서는 별도의 Type Checking Framework 이 필요
• Washington University – Checker Framework
![Page 44: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/44.jpg)
REPEATING ANNOTATION
• java.lang.annotation.Repeatable
• 중복 Annotation 지정 허용
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }
![Page 45: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/45.jpg)
JDK CONVERGENCE
• JRockit + Hotspot
• Java Mission Control, Flight Recorder
• Permgen 제거
• JRockit Real Time Deterministic GC
![Page 46: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/46.jpg)
JDK CONVERGENCE
Java Mission Control(JDK7U40+)
![Page 47: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/47.jpg)
PERMANENT GENERATION 제거
• string pool 은 Java 7 에서 Heap 영역으로 이동
• Class 정보는 Metaspace 라는 Native Memory 영역으로 이동 됨
• Virtual Memory 가 허용하는 한 최대한 할당 가능
• MaxMetaspaceSize로 사이즈 조정 가능
• Garbage Collection
• Permanent 에 저장되던 일부 데이타들이 heap 으로 옮겨서 저장됨으로써 메모리 사용량이 증가 할 수 있음
![Page 48: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/48.jpg)
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 의 번들 사이즈
![Page 49: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/49.jpg)
Beyond Java 8
![Page 50: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/50.jpg)
• Lambda -- JSR 335
• Date & Time API -- JSR 310
• Nashorn JavaScript Engine
• Compact Profiles
• Security Enhancements
Java 8 Features
• Modular Platform (Jigsaw)
• Unified Type System
• Language Interoperability
• Memory-efficient data structures
• Java on GPUs (Sumatra)
Beyond Java 8
![Page 51: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/51.jpg)
PROJECT JIGSAW
![Page 52: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/52.jpg)
현재의 JAVA
Java SE 7
APIs Language
Java SE 7
CDC 1.1
CDC 1.1 (based on SE 1.4.2)
CLDC 1.1 (based on SE 1.3)
CLDC 1.1
![Page 53: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/53.jpg)
JAVA 8
Java SE 8 Java SE 8
Java ME 8 Java ME 8
APIs Language
![Page 54: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/54.jpg)
BEYOND JAVA 8
Java SE Java SE
Small Device
s
Small
Devices
APIs Language
![Page 55: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/55.jpg)
JAVA ROADMAP
JDK 8 (Q1 2014)
• Lambda
• JVM Convergence
• JavaScript Interop
• JavaFX 8
7u40
• Java Flight Recorder
• Java Mission Control
• Java Discovery Protocol
• Native memory tracking
• Local Security Policy
JDK 9
• Modularity – Jigsaw
• Interoperability
• Cloud
• Ease of Use
• Optimizations
7u21
• 클라이언트 보안 강화
• 앱스토어 패키징 툴
Java ME Embedded 3.4
• Fast follow-on
• QSC platform only
• 온디바이스 모니터링, 디버깅 지원
Java Embedded 9
• Java ME and SE 9
• Modularity based on Jigsaw
Java SE Embedded 8 • JVM 통합 완료 • Compact Profiles • Support for ARM, Power PC & x86
• Java Flight Recorder/Mission Control
• Simple migration of ME CDC headless applications
Java ME Embedded 8 • Java ME CLDC 8 & ME Embedded Profile 8
• “Little sibling” of Java SE 8
• New & enhanced Embedded API
• New portable architecture
2015 2013 2014 2016
![Page 56: Java 8 & Beyond](https://reader036.vdocuments.site/reader036/viewer/2022081512/5573201bd8b42aae7b8b4c59/html5/thumbnails/56.jpg)
감사합니다.