SlideShare a Scribd company logo
1 of 48
Download to read offline
JDK 버전별 변화
JAVA의 시작 - Green Project
객체지향적이고 안전하며
한번의 작성으로 어디서든 실행할 수 있고
네트워크에 접근할 수 있는 기능이 제공되며
사용하기 편한 언어가 있으라 하시니 ..
JDK 1.0 (OAK)
Jan 23, 1996
• 단순한 구조와 구현
• 객체지향 (완벽하진 않지만)
• 분산처리지원
• 중립적, 이식성
• 안전함
• 언어차원의 멀티쓰레드 지원
B 1.0
1.2
1.3
1995 OAK
1996
PLAYGROU
ND
1998
KESTREL
2000
1.4
MERLIN
2002
5
TIGER
2004
6
MUSTANG
2006
7
DOLPHIN
2011
8
2014
1.1
1997
JDK 1.1
Feb 19, 1997
• AWT Event Model 대대적 개선
• 중첩 클래스 지원
• JavaBeans
• JDBC
• RMI
그리고……
드디어 Java라는 이름 획득
JDK 1.2(1998), 1.3(2000)
• J2SE, J2EE, J2ME
• strictfp 키워드
• 스윙
• Java plug-in
• Collections 프레임워크
• 핫스팟 JVM
J2EE 1.2
• JDBC 2.0
• JNI 1.2
• Servlet 2.2
• JSP 1.1
• EJB 1.1
• JMS 1.0
• JTA 1.0
• Java Mail 1.1
• JAF 1.0
JDK 1.4 (MERLIN)
• 정규식 지원
• IPv6 지원
• NIO
• Logging API
• Image I/O API
• JAXP
• Java Web Start
J2SE 5 (Tiger)
• Generics
• Metadata
• Autoboxing/Un..
• Enumerations
• Varargs
• For each loop
JavaSE 6 (Mustang)
• Rhino
• JAX-WS
• JDBC 4.0
• JAXB 2.0
JAVA SE 7
(DOLPHIN, 2011)
try-with-resources
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader(“a.txt”));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
try (BufferdReader br = new BufferedReader ..;)
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
• 자원의 회수를 자동으로 해주니까 번거롭지 않고
• 여러 자원들에 대해서도 동작하며
• 덕분에 코드가 간결해짐
우와…
이거 다됨?
리소스가 AutoCloseable 인터페이스를 구현하는 클래스에 한하여
블록이 어떻게 종료되든 모두 닫힌다.
Multi - catch
try {
……
} catch (FileNotFoundException | UnknownHostException ex) {
……
} catch (IOException ex) {
……
}
다른 분류에 속하는 예외에 대하여 같은 처리기에 두어
비교적 구문이 간략화 됨
try {
……
} catch (FileNotFoundException ex) {
……
} catch (UnknownHostException ex) {
……
} catch (IOException ex) {
……
}
ReflectiveOperationException
Class.forName(“com.Wildpup.ref.test”).getMethod(“main”).invoke(null, new String[] {});
ClassNotFound
IllegalAccess
InvocationTarget
NoSuch
Method
처리할 놈들이 너무 많아 구문이 구구절절 하다..
multi-catch 를 이용하여 간소화할 수 있지만
ReflectiveOperationException을 이용하면
모두 단일 처리기에서 잡을 수 있다.
NIO 2.0으로 간편해진 파일 처리
Path p = Paths.get(“/home”, “nabi”, “my”);
Path p = p.getParent(); /home/nabi
Path p = p.getFileName(); /my
Path p = p.getRoot(); / (상대경로의 경우 null)
Byte[] bytes = Files.readAllBytes(path); 파일의 내용을 읽기
String content = new String(bytes, StandardCharsets.UTF_8); 문자열로 읽기
List<String> lines = Files.readAllLines(path); 행으로 읽기
Files.write(path, content.getBytes(StandardCharsets.UTF_8)); 문자열 쓰기
Files.write(path, lines); 행들로 구성된 컬렉션 쓰기
Files.write(path, lines, StandardOpenOption.APPEND); 파일에 내용 추가
경로
파일 읽고 쓰기
Files.createDirectory(path);
Files.createDirectories(path); 중간 디렉토리까지 모두 생성
Files.createFile(path); 빈 파일 생성
파일과 디렉토리 생성
Files.copy(fromPath, toPath); 복사
Files.move(fromPath, toPath); 이동
Files.copy(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING); 덮어쓰기
Files.move(fromPath, toPath, StandardCopyOption.ATOMIC_MOVE); 원자성 보장
Files.delete(path); 삭제
파일 제어
private void init() {
path = Paths.get("D:");
try {
watchService = FileSystems.getDefault().newWatchService(); WatchKey를 가지고 있는 큐로 구성
path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ..); 모니터링 대상과 이벤트 타입 등록
…
}
private void watch() {
WatchKey key= null;
while(true) {
try {
key = watchService.take(); 이벤트 잡기 시작
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
System.out.println("Event on " + event.context().toString() + " is " + kind);
}
…
boolean reset = key.reset();
if ( ! reset) break;
}
NIO 2.0의 File Change Notifications
InheritIO Method
ProcessBuilder bd = new ProcessBuilder(“ls”, “-al”);
Bd.redirectOutput(Paths.get(“iden.txt”).toFile());
Process process = builder.start();
Boolean complete = process.waitFor(1, TimeUnit.MINUTES); 이건 사실 8의 기능..
ProcessBuilder bd = new ProcessBuilder(“ls”, “-al”);
bd.inheritIO();
bd.start().waitFor();
inheritIO 메서드는
프로세스의 표준 입/출력, 오류 스트림을
자바의 표준 입/출력, 오류 스트림으로 변경
그 외 몇 가지..
Map<String, List<String>> map = new HashMap<String, List<String>>();
<> 지시자
Map<String, List<String>> map = new HashMap<>(); 간결하게..
Objects.equals(a, b); 둘다 null이면 true, a만 null이면 false, 그 외에는 a.equals(b)를 리턴
Objects.equals로 null 안전 동등성 테스트를 ..
Arrays.hashCode를 이용할 수도 있지만 Arrays.hashCode는 가변 인자 Method가 아니라 불편했었다.
Objects.hash 메서드
Objects.hash(first, last); 이 Method는 지정값들의 Hash code를 결합한다.
정말 그 외..
Switch문의 String 지원
문자열 숫자 변환 문제 해결
Binary integer literals
등등..
int million = 1_000_000;
Allowing underscores in numeric literals
JAVA SE 8
(2014)
JAVA SE 8
• 람다
• 스트림 API
• JavaFX
• 나스혼 JS 엔진
• 그 외..
(인자목록) -> { 구문 }
(final String f, @NonNull String s) -> // 메서드 파라미터와 같은 형식
Integer.compare(f.length(), s.length())
(String f, String s) -> { // 메서드가 길어질 경우 괄호 사용
if (f.length() < s.length()) return -1;
else if (f.length() > s.length()) return 1;
else return 0; // 결과 타입은 문맥에서 추정
}
// 파라미터의 타입이 추정가능할 경우 타입 생략 가능
Comparator<String> comp = (f, s)
-> Integer.compare(f.length(), s.length());
( ) -> { System.out.println(“Hello World!”);
모든 람다의 핵심은 지연 실행(deferred execution)
예 )
• 별도의 스레드에서 코드 실행
• 코드를 여러 번 실행
• 알고리즘에서 코드를 적절한 시점에 실행
• 어떤 일이 발생했을 때 코드 실행
• 필요할 때만 코드 실행
짧게 요약하면 !
람다 표현식을 이용하는 주 이유는 적절한 시점까지
코드의 실행을 지연시키기 위해 작성한
전달 가능한 코드 블록
class Worker implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
doWork();
}
}
}
Worker w = new Worker();
New Thread(w).start();
class LenthComparator implements Comparator<String> {
public int compare(String f, String s) {
return Integer.compare(f.length(), s.length());
}
}
Array.sort(Strings, new LengthComparator());
Button.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
System.out.println(“OK!”);
}
}
코드 블록을 어딘가로 전달하고 얼마 후에 호출된다.
지금까지 자바는 어딘가에 코드
블록을 전달하는 것이 쉽지 않았다는
불편한 진실…
그럼 람다를 이용해 바꿔보면 ..
Array.sort(Strings, (f, s) -> Interger.compare(f.length(), s.length()));
class LenthComparator implements Comparator<String> {
public int compare(String f, String s) {
return Integer.compare(f.length(), s.length());
}
} Array.sort(Strings, new LengthComparator());
하지만 뭔가 신기하죠..?
이 메서드는 단일 메서드를 갖춘 인터페이스인
Comparator의 인스턴스를 요구하는 것 같은데..
함수형 인터페이스 (functional interface)
• 단일 추상 메서드를 갖춘 인터페이스
• Object Class의 메서드는 빼고..
(여러가지 이유가 있지만 Java8에서는 인터페이스에 비추상 메서드를 정의할 수 있다.)
람다를 구성하고 있는 것은 하나 더 있다.
1. 코드 블록
2. 파라미터
3. ?
public static void repeatMessage(String test, int count) {
Runnable r = () -> {
for (int i = 0; i < count; i++) {
System.out.println(text);
Thread.yield();
}
};
new Thread(r).start();
}
…
repeatMessage(“Hello”, 1000)
• count와 text는 람다에 정의되어 있지 않다.
• 람다는 지연 실행을 위해 존재한다.
람다를 구성하고 있는 것은 하나 더 있다.
1. 코드 블록
2. 파라미터
3. 자유변수
람다 = 클로저(Closure)
JAVA SE 8
• 람다
• 스트림 API
• JavaFX
• 나스혼 JS 엔진
• 그 외..
List<String> words = Arrays.asList(contents.split(“[P{L}]+”));
int count = 0;
for (String w : words) {
if (w.length() > 10) count++;
}
long count = words.stream().filter(w -> w.length() > 12).count();
일반 순회 처리 코드를 스트림 API로 ..
짧아졌다!!!
words.stream().filter(w -> w.length() > 12).count();
스트림 연산 파이프라인
스트림생성 중간 연산 최종 연산
• stream
• parallelStream
• filter
• map
• distinct
• flatMap
• sorted
• peek
• limit
• skip
• toArray
• foreach
• collect
• reduce
• min
• max
• count
• firstFind
• anyFind
• anyMatch
• allMatch
• nonMatch
최종연산 이후에는 해당 스트림을 더 이상 사용할 수 없다.
JAVA SE 8
• 람다
• 스트림 API
• JavaFX
• 나스혼 JS 엔진
• 그 외..
JAVA의 구린 GUI 역사
AWT
• 크로스플랫폼
• 각 운영체제의 네이티브 GUI 요소 프로그래밍 인터페이스 제공
• 생각만큼 잘 동작하지 않았고 각 운영체제마다 미묘한 차이를 가짐
스윙
• 네이티브를 사용하지 않고 자체적으로 드로잉하는 방식
• 모든 플랫폼에서 동일한 효과
• 덕분에 좋지 않은 성능
JavaFX (2.2 까지)
• 플래시의 경쟁자라 자칭
• JVM위에서 돌아가지만 자체적인 스크립트 언어로 인해 거부감을 줌
그리고 JavaFX 8
• 람다와 결합된 비교적 간단한 사용
• 선언형 언어를 이용한 레이아웃 지정 (HTML, CSS, FXML)
• ARM 플랫폼 지원
• 스윙 컴포넌트와 친화력 강화
• 3D Graphics API 추가
• Canvas API
• Multi-touch 지원
• Hi-DPI 디스플레이 지원
JAVA SE 8
• 람다
• 스트림 API
• JavaFX
• 나스혼 JS 엔진
• 그 외..
잘 가 Rhino.
새로운 인터프리터 나스혼 (Nashorn)
• 새로운 JVM 인스트럭션을 사용하여 효율적인 성능을 냄
• ECMAScript 표준을 잘 준수
• jjs 인터프리터와 자바 스크립팅 API를 제공
• 자바빈즈 프로퍼티, 리스트와 맵을 다루는 편리한 문법 제공
• 람다 표현식 사용과 유사한 방식으로 자바스크립트 함수를
자바 인터페이스로 변환 가능
ScriptEngineManager manager = new ScriptEnginManager();
ScriptEngine engine = manager.getEnginByName(“nashorn”);
Object result = engine.eval(“’Hello, World!’.length”);
System.out.println(result);
나스혼 실행
JAVA8과 함께 제공되는 jjs 명령행 도구 이용
JAVA6부터 제공한 스크립트 엔진 메커니즘 사용
나스혼과 JavaFX
var message = new javafx.scene.control.Label("Hello, JavaFX!");
message.font = new javafx.scene.text.Font(100);
$STAGE.scene = new javafx.scene.Scene(message);
$STAGE.title = "Nashorn!";
그 외 몇 가지..
• Join 메서드 (Java8에 String 클래스에 추가된 유일한 메서드)
• Base64 표준 인코더/디코더 제공
• Annotation 개선
• 날짜/시간 API 개선
• JDBC 4.2 업데이트
JDK 변천사

More Related Content

What's hot

Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
자바8강의 2강. Stream API
자바8강의 2강. Stream API자바8강의 2강. Stream API
자바8강의 2강. Stream APISejong Park
 

What's hot (19)

Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
Java lambda
Java lambdaJava lambda
Java lambda
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
Javascript
JavascriptJavascript
Javascript
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
자바8강의 2강. Stream API
자바8강의 2강. Stream API자바8강의 2강. Stream API
자바8강의 2강. Stream API
 

Viewers also liked

Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문SeungHyun Eom
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
Spring4 Chapter 2
Spring4 Chapter 2Spring4 Chapter 2
Spring4 Chapter 2상호 한
 
Microsoft BizSpark 소개 (Korea)
Microsoft BizSpark 소개 (Korea)Microsoft BizSpark 소개 (Korea)
Microsoft BizSpark 소개 (Korea)HyunJung Kim
 
기업가정신과 지역특화산업
기업가정신과 지역특화산업기업가정신과 지역특화산업
기업가정신과 지역특화산업Yong-wook Shin
 
2016 경남과기대 창업대학원 신입생 안내
2016 경남과기대 창업대학원 신입생 안내2016 경남과기대 창업대학원 신입생 안내
2016 경남과기대 창업대학원 신입생 안내Sanghyeok Park
 
씨앗들 경작 활동
씨앗들 경작 활동씨앗들 경작 활동
씨앗들 경작 활동봉석 곽
 
Aws개념 EC2로 API서버 구축
Aws개념 EC2로 API서버 구축Aws개념 EC2로 API서버 구축
Aws개념 EC2로 API서버 구축Gi Bong Kim
 
Good to know Wine
Good to know WineGood to know Wine
Good to know WineINMD
 
다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!우영 주
 
인터넷전문은행 Fi-ntechkorea.com
인터넷전문은행  Fi-ntechkorea.com인터넷전문은행  Fi-ntechkorea.com
인터넷전문은행 Fi-ntechkorea.comYong Joon Moon
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Kim Hunmin
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaHyeonSeok Choi
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나종민 김
 
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)Amazon Web Services Korea
 
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)Amazon Web Services Korea
 
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기Baekjoon Choi
 

Viewers also liked (20)

Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문Elastic Search (엘라스틱서치) 입문
Elastic Search (엘라스틱서치) 입문
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
Spring4 Chapter 2
Spring4 Chapter 2Spring4 Chapter 2
Spring4 Chapter 2
 
Microsoft BizSpark 소개 (Korea)
Microsoft BizSpark 소개 (Korea)Microsoft BizSpark 소개 (Korea)
Microsoft BizSpark 소개 (Korea)
 
기업가정신과 지역특화산업
기업가정신과 지역특화산업기업가정신과 지역특화산업
기업가정신과 지역특화산업
 
2016 경남과기대 창업대학원 신입생 안내
2016 경남과기대 창업대학원 신입생 안내2016 경남과기대 창업대학원 신입생 안내
2016 경남과기대 창업대학원 신입생 안내
 
3
33
3
 
씨앗들 경작 활동
씨앗들 경작 활동씨앗들 경작 활동
씨앗들 경작 활동
 
Aws개념 EC2로 API서버 구축
Aws개념 EC2로 API서버 구축Aws개념 EC2로 API서버 구축
Aws개념 EC2로 API서버 구축
 
Good to know Wine
Good to know WineGood to know Wine
Good to know Wine
 
다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!
 
인터넷전문은행 Fi-ntechkorea.com
인터넷전문은행  Fi-ntechkorea.com인터넷전문은행  Fi-ntechkorea.com
인터넷전문은행 Fi-ntechkorea.com
 
역시 Redux
역시 Redux역시 Redux
역시 Redux
 
Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까? Facebook은 React를 왜 만들었을까?
Facebook은 React를 왜 만들었을까?
 
JMeter
JMeterJMeter
JMeter
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나
 
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)
10월 웨비나 - 편하게 들어보는Microsoft on AWS 이야기 (노경훈 매니저)
 
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)
10월 웨비나 - AWS에서 MS Windows 운영, 관리 및 개발 손쉽게 하기 (박철수 솔루션즈 아키텍트)
 
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
 

Similar to JDK 변천사

Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2destinycs
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2도현 김
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With GroovyTommy C. Kang
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & BeyondJay Lee
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 
자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라Jong Gook Bae
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 

Similar to JDK 변천사 (20)

Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scalability
ScalabilityScalability
Scalability
 
Scala
ScalaScala
Scala
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
Java mentoring of samsung scsc 2
Java mentoring of samsung scsc   2Java mentoring of samsung scsc   2
Java mentoring of samsung scsc 2
 
Domain Specific Languages With Groovy
Domain Specific Languages With GroovyDomain Specific Languages With Groovy
Domain Specific Languages With Groovy
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
Java.next
Java.nextJava.next
Java.next
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라자바프로그래머를 위한 스칼라
자바프로그래머를 위한 스칼라
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Java 8 고급 (1/6)
Java 8 고급 (1/6)Java 8 고급 (1/6)
Java 8 고급 (1/6)
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 

JDK 변천사

  • 2. JAVA의 시작 - Green Project 객체지향적이고 안전하며 한번의 작성으로 어디서든 실행할 수 있고 네트워크에 접근할 수 있는 기능이 제공되며 사용하기 편한 언어가 있으라 하시니 ..
  • 3. JDK 1.0 (OAK) Jan 23, 1996 • 단순한 구조와 구현 • 객체지향 (완벽하진 않지만) • 분산처리지원 • 중립적, 이식성 • 안전함 • 언어차원의 멀티쓰레드 지원
  • 5. JDK 1.1 Feb 19, 1997 • AWT Event Model 대대적 개선 • 중첩 클래스 지원 • JavaBeans • JDBC • RMI 그리고…… 드디어 Java라는 이름 획득
  • 6. JDK 1.2(1998), 1.3(2000) • J2SE, J2EE, J2ME • strictfp 키워드 • 스윙 • Java plug-in • Collections 프레임워크 • 핫스팟 JVM J2EE 1.2 • JDBC 2.0 • JNI 1.2 • Servlet 2.2 • JSP 1.1 • EJB 1.1 • JMS 1.0 • JTA 1.0 • Java Mail 1.1 • JAF 1.0
  • 7. JDK 1.4 (MERLIN) • 정규식 지원 • IPv6 지원 • NIO • Logging API • Image I/O API • JAXP • Java Web Start J2SE 5 (Tiger) • Generics • Metadata • Autoboxing/Un.. • Enumerations • Varargs • For each loop JavaSE 6 (Mustang) • Rhino • JAX-WS • JDBC 4.0 • JAXB 2.0
  • 9. try-with-resources BufferedReader br = null; try { String line; br = new BufferedReader(new FileReader(“a.txt”)); while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); } catch (IOException ex) { ex.printStackTrace(); } } try (BufferdReader br = new BufferedReader ..;) String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } • 자원의 회수를 자동으로 해주니까 번거롭지 않고 • 여러 자원들에 대해서도 동작하며 • 덕분에 코드가 간결해짐
  • 11. 리소스가 AutoCloseable 인터페이스를 구현하는 클래스에 한하여 블록이 어떻게 종료되든 모두 닫힌다.
  • 12. Multi - catch try { …… } catch (FileNotFoundException | UnknownHostException ex) { …… } catch (IOException ex) { …… } 다른 분류에 속하는 예외에 대하여 같은 처리기에 두어 비교적 구문이 간략화 됨 try { …… } catch (FileNotFoundException ex) { …… } catch (UnknownHostException ex) { …… } catch (IOException ex) { …… }
  • 15. multi-catch 를 이용하여 간소화할 수 있지만 ReflectiveOperationException을 이용하면 모두 단일 처리기에서 잡을 수 있다.
  • 16. NIO 2.0으로 간편해진 파일 처리
  • 17. Path p = Paths.get(“/home”, “nabi”, “my”); Path p = p.getParent(); /home/nabi Path p = p.getFileName(); /my Path p = p.getRoot(); / (상대경로의 경우 null) Byte[] bytes = Files.readAllBytes(path); 파일의 내용을 읽기 String content = new String(bytes, StandardCharsets.UTF_8); 문자열로 읽기 List<String> lines = Files.readAllLines(path); 행으로 읽기 Files.write(path, content.getBytes(StandardCharsets.UTF_8)); 문자열 쓰기 Files.write(path, lines); 행들로 구성된 컬렉션 쓰기 Files.write(path, lines, StandardOpenOption.APPEND); 파일에 내용 추가 경로 파일 읽고 쓰기 Files.createDirectory(path); Files.createDirectories(path); 중간 디렉토리까지 모두 생성 Files.createFile(path); 빈 파일 생성 파일과 디렉토리 생성 Files.copy(fromPath, toPath); 복사 Files.move(fromPath, toPath); 이동 Files.copy(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING); 덮어쓰기 Files.move(fromPath, toPath, StandardCopyOption.ATOMIC_MOVE); 원자성 보장 Files.delete(path); 삭제 파일 제어
  • 18. private void init() { path = Paths.get("D:"); try { watchService = FileSystems.getDefault().newWatchService(); WatchKey를 가지고 있는 큐로 구성 path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ..); 모니터링 대상과 이벤트 타입 등록 … } private void watch() { WatchKey key= null; while(true) { try { key = watchService.take(); 이벤트 잡기 시작 for (WatchEvent<?> event : key.pollEvents()) { WatchEvent.Kind<?> kind = event.kind(); System.out.println("Event on " + event.context().toString() + " is " + kind); } … boolean reset = key.reset(); if ( ! reset) break; } NIO 2.0의 File Change Notifications
  • 19. InheritIO Method ProcessBuilder bd = new ProcessBuilder(“ls”, “-al”); Bd.redirectOutput(Paths.get(“iden.txt”).toFile()); Process process = builder.start(); Boolean complete = process.waitFor(1, TimeUnit.MINUTES); 이건 사실 8의 기능.. ProcessBuilder bd = new ProcessBuilder(“ls”, “-al”); bd.inheritIO(); bd.start().waitFor(); inheritIO 메서드는 프로세스의 표준 입/출력, 오류 스트림을 자바의 표준 입/출력, 오류 스트림으로 변경
  • 20. 그 외 몇 가지.. Map<String, List<String>> map = new HashMap<String, List<String>>(); <> 지시자 Map<String, List<String>> map = new HashMap<>(); 간결하게.. Objects.equals(a, b); 둘다 null이면 true, a만 null이면 false, 그 외에는 a.equals(b)를 리턴 Objects.equals로 null 안전 동등성 테스트를 .. Arrays.hashCode를 이용할 수도 있지만 Arrays.hashCode는 가변 인자 Method가 아니라 불편했었다. Objects.hash 메서드 Objects.hash(first, last); 이 Method는 지정값들의 Hash code를 결합한다. 정말 그 외.. Switch문의 String 지원 문자열 숫자 변환 문제 해결 Binary integer literals 등등.. int million = 1_000_000; Allowing underscores in numeric literals
  • 22. JAVA SE 8 • 람다 • 스트림 API • JavaFX • 나스혼 JS 엔진 • 그 외..
  • 23. (인자목록) -> { 구문 } (final String f, @NonNull String s) -> // 메서드 파라미터와 같은 형식 Integer.compare(f.length(), s.length()) (String f, String s) -> { // 메서드가 길어질 경우 괄호 사용 if (f.length() < s.length()) return -1; else if (f.length() > s.length()) return 1; else return 0; // 결과 타입은 문맥에서 추정 } // 파라미터의 타입이 추정가능할 경우 타입 생략 가능 Comparator<String> comp = (f, s) -> Integer.compare(f.length(), s.length()); ( ) -> { System.out.println(“Hello World!”);
  • 24. 모든 람다의 핵심은 지연 실행(deferred execution) 예 ) • 별도의 스레드에서 코드 실행 • 코드를 여러 번 실행 • 알고리즘에서 코드를 적절한 시점에 실행 • 어떤 일이 발생했을 때 코드 실행 • 필요할 때만 코드 실행
  • 25. 짧게 요약하면 ! 람다 표현식을 이용하는 주 이유는 적절한 시점까지 코드의 실행을 지연시키기 위해 작성한 전달 가능한 코드 블록
  • 26. class Worker implements Runnable { public void run() { for (int i = 0; i < 100; i++) { doWork(); } } } Worker w = new Worker(); New Thread(w).start(); class LenthComparator implements Comparator<String> { public int compare(String f, String s) { return Integer.compare(f.length(), s.length()); } } Array.sort(Strings, new LengthComparator()); Button.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { System.out.println(“OK!”); } } 코드 블록을 어딘가로 전달하고 얼마 후에 호출된다.
  • 27. 지금까지 자바는 어딘가에 코드 블록을 전달하는 것이 쉽지 않았다는 불편한 진실…
  • 28. 그럼 람다를 이용해 바꿔보면 .. Array.sort(Strings, (f, s) -> Interger.compare(f.length(), s.length())); class LenthComparator implements Comparator<String> { public int compare(String f, String s) { return Integer.compare(f.length(), s.length()); } } Array.sort(Strings, new LengthComparator());
  • 29. 하지만 뭔가 신기하죠..? 이 메서드는 단일 메서드를 갖춘 인터페이스인 Comparator의 인스턴스를 요구하는 것 같은데..
  • 30. 함수형 인터페이스 (functional interface) • 단일 추상 메서드를 갖춘 인터페이스 • Object Class의 메서드는 빼고.. (여러가지 이유가 있지만 Java8에서는 인터페이스에 비추상 메서드를 정의할 수 있다.)
  • 31. 람다를 구성하고 있는 것은 하나 더 있다. 1. 코드 블록 2. 파라미터 3. ?
  • 32. public static void repeatMessage(String test, int count) { Runnable r = () -> { for (int i = 0; i < count; i++) { System.out.println(text); Thread.yield(); } }; new Thread(r).start(); } … repeatMessage(“Hello”, 1000) • count와 text는 람다에 정의되어 있지 않다. • 람다는 지연 실행을 위해 존재한다.
  • 33. 람다를 구성하고 있는 것은 하나 더 있다. 1. 코드 블록 2. 파라미터 3. 자유변수
  • 35. JAVA SE 8 • 람다 • 스트림 API • JavaFX • 나스혼 JS 엔진 • 그 외..
  • 36. List<String> words = Arrays.asList(contents.split(“[P{L}]+”)); int count = 0; for (String w : words) { if (w.length() > 10) count++; } long count = words.stream().filter(w -> w.length() > 12).count(); 일반 순회 처리 코드를 스트림 API로 ..
  • 38. words.stream().filter(w -> w.length() > 12).count(); 스트림 연산 파이프라인 스트림생성 중간 연산 최종 연산 • stream • parallelStream • filter • map • distinct • flatMap • sorted • peek • limit • skip • toArray • foreach • collect • reduce • min • max • count • firstFind • anyFind • anyMatch • allMatch • nonMatch 최종연산 이후에는 해당 스트림을 더 이상 사용할 수 없다.
  • 39. JAVA SE 8 • 람다 • 스트림 API • JavaFX • 나스혼 JS 엔진 • 그 외..
  • 40. JAVA의 구린 GUI 역사 AWT • 크로스플랫폼 • 각 운영체제의 네이티브 GUI 요소 프로그래밍 인터페이스 제공 • 생각만큼 잘 동작하지 않았고 각 운영체제마다 미묘한 차이를 가짐 스윙 • 네이티브를 사용하지 않고 자체적으로 드로잉하는 방식 • 모든 플랫폼에서 동일한 효과 • 덕분에 좋지 않은 성능 JavaFX (2.2 까지) • 플래시의 경쟁자라 자칭 • JVM위에서 돌아가지만 자체적인 스크립트 언어로 인해 거부감을 줌
  • 41. 그리고 JavaFX 8 • 람다와 결합된 비교적 간단한 사용 • 선언형 언어를 이용한 레이아웃 지정 (HTML, CSS, FXML) • ARM 플랫폼 지원 • 스윙 컴포넌트와 친화력 강화 • 3D Graphics API 추가 • Canvas API • Multi-touch 지원 • Hi-DPI 디스플레이 지원
  • 42. JAVA SE 8 • 람다 • 스트림 API • JavaFX • 나스혼 JS 엔진 • 그 외..
  • 44. 새로운 인터프리터 나스혼 (Nashorn) • 새로운 JVM 인스트럭션을 사용하여 효율적인 성능을 냄 • ECMAScript 표준을 잘 준수 • jjs 인터프리터와 자바 스크립팅 API를 제공 • 자바빈즈 프로퍼티, 리스트와 맵을 다루는 편리한 문법 제공 • 람다 표현식 사용과 유사한 방식으로 자바스크립트 함수를 자바 인터페이스로 변환 가능
  • 45. ScriptEngineManager manager = new ScriptEnginManager(); ScriptEngine engine = manager.getEnginByName(“nashorn”); Object result = engine.eval(“’Hello, World!’.length”); System.out.println(result); 나스혼 실행 JAVA8과 함께 제공되는 jjs 명령행 도구 이용 JAVA6부터 제공한 스크립트 엔진 메커니즘 사용
  • 46. 나스혼과 JavaFX var message = new javafx.scene.control.Label("Hello, JavaFX!"); message.font = new javafx.scene.text.Font(100); $STAGE.scene = new javafx.scene.Scene(message); $STAGE.title = "Nashorn!";
  • 47. 그 외 몇 가지.. • Join 메서드 (Java8에 String 클래스에 추가된 유일한 메서드) • Base64 표준 인코더/디코더 제공 • Annotation 개선 • 날짜/시간 API 개선 • JDBC 4.2 업데이트