48
JDK 버전별 변화

JDK 변천사

Embed Size (px)

Citation preview

Page 1: JDK 변천사

JDK 버전별 변화

Page 2: JDK 변천사

JAVA의 시작 - Green Project

객체지향적이고 안전하며

한번의 작성으로 어디서든 실행할 수 있고

네트워크에 접근할 수 있는 기능이 제공되며

사용하기 편한 언어가 있으라 하시니 ..

Page 3: JDK 변천사

JDK 1.0 (OAK)Jan 23, 1996

• 단순한 구조와 구현

• 객체지향 (완벽하진 않지만)

• 분산처리지원

• 중립적, 이식성

• 안전함

• 언어차원의 멀티쓰레드 지원

Page 4: JDK 변천사

B 1.0

1.2

1.3

1995 OAK1996

PLAYGROUND

1998KESTREL

2000

1.4

MERLIN2002

5

TIGER

20046

MUSTANG

2006

7

DOLPHIN

2011

8

2014

1.1

1997

Page 5: JDK 변천사

JDK 1.1 Feb 19, 1997

• AWT Event Model 대대적 개선

• 중첩 클래스 지원

• JavaBeans

• JDBC

• RMI

그리고……드디어 Java라는 이름 획득

Page 6: JDK 변천사

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

Page 7: JDK 변천사

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

Page 8: JDK 변천사

JAVA SE 7 (DOLPHIN, 2011)

Page 9: JDK 변천사

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();

}

• 자원의 회수를 자동으로 해주니까 번거롭지 않고

• 여러 자원들에 대해서도 동작하며

• 덕분에 코드가 간결해짐

Page 10: JDK 변천사

우와…

이거 다됨?

Page 11: JDK 변천사

리소스가 AutoCloseable 인터페이스를 구현하는 클래스에 한하여

블록이 어떻게 종료되든 모두 닫힌다.

Page 12: JDK 변천사

Multi - catch

try {……

} catch (FileNotFoundException | UnknownHostException ex) {……

} catch (IOException ex) {……

}

다른 분류에 속하는 예외에 대하여 같은 처리기에 두어

비교적 구문이 간략화 됨

try {……

} catch (FileNotFoundException ex) {……

} catch (UnknownHostException ex) {……

} catch (IOException ex) {……

}

Page 13: JDK 변천사

ReflectiveOperationException

Class.forName(“com.Wildpup.ref.test”).getMethod(“main”).invoke(null, new String[] {});

Page 14: JDK 변천사

ClassNotFound

IllegalAccess

InvocationTarget

NoSuchMethod

처리할 놈들이 너무 많아 구문이 구구절절 하다..

Page 15: JDK 변천사

multi-catch 를 이용하여 간소화할 수 있지만ReflectiveOperationException을 이용하면

모두 단일 처리기에서 잡을 수 있다.

Page 16: JDK 변천사

NIO 2.0으로 간편해진 파일 처리

Page 17: JDK 변천사

Path p = Paths.get(“/home”, “nabi”, “my”);Path p = p.getParent(); /home/nabiPath p = p.getFileName(); /myPath 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); 삭제

파일 제어

Page 18: JDK 변천사

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

Page 19: JDK 변천사

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 메서드는프로세스의 표준 입/출력, 오류 스트림을

자바의 표준 입/출력, 오류 스트림으로 변경

Page 20: JDK 변천사

그 외 몇 가지..

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

Page 21: JDK 변천사

JAVA SE 8 (2014)

Page 22: JDK 변천사

JAVA SE 8

• 람다

• 스트림 API

• JavaFX

• 나스혼 JS 엔진

• 그 외..

Page 23: JDK 변천사

(인자목록) -> { 구문 }

(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!”);

Page 24: JDK 변천사

모든 람다의 핵심은 지연 실행(deferred execution)

예 )

• 별도의 스레드에서 코드 실행

• 코드를 여러 번 실행

• 알고리즘에서 코드를 적절한 시점에 실행

• 어떤 일이 발생했을 때 코드 실행

• 필요할 때만 코드 실행

Page 25: JDK 변천사

짧게 요약하면 !

람다 표현식을 이용하는 주 이유는 적절한 시점까지코드의 실행을 지연시키기 위해 작성한

전달 가능한 코드 블록

Page 26: JDK 변천사

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!”);

}}

코드 블록을 어딘가로 전달하고 얼마 후에 호출된다.

Page 27: JDK 변천사

지금까지 자바는 어딘가에 코드

블록을 전달하는 것이 쉽지 않았다는

불편한 진실…

Page 28: JDK 변천사

그럼 람다를 이용해 바꿔보면 ..

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());

Page 29: JDK 변천사

하지만 뭔가 신기하죠..?

이 메서드는 단일 메서드를 갖춘 인터페이스인Comparator의 인스턴스를 요구하는 것 같은데..

Page 30: JDK 변천사

함수형 인터페이스 (functional interface)

• 단일 추상 메서드를 갖춘 인터페이스

• Object Class의 메서드는 빼고..(여러가지 이유가 있지만 Java8에서는 인터페이스에 비추상 메서드를 정의할 수 있다.)

Page 31: JDK 변천사

람다를 구성하고 있는 것은 하나 더 있다.

1. 코드 블록

2. 파라미터

3. ?

Page 32: JDK 변천사

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는 람다에 정의되어 있지 않다.

• 람다는 지연 실행을 위해 존재한다.

Page 33: JDK 변천사

람다를 구성하고 있는 것은 하나 더 있다.

1. 코드 블록

2. 파라미터

3. 자유변수

Page 34: JDK 변천사

람다 = 클로저(Closure)

Page 35: JDK 변천사

JAVA SE 8

• 람다

• 스트림 API

• JavaFX

• 나스혼 JS 엔진

• 그 외..

Page 36: JDK 변천사

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로 ..

Page 37: JDK 변천사

짧아졌다!!!

Page 38: JDK 변천사

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

최종연산 이후에는 해당 스트림을 더 이상 사용할 수 없다.

Page 39: JDK 변천사

JAVA SE 8

• 람다

• 스트림 API

• JavaFX

• 나스혼 JS 엔진

• 그 외..

Page 40: JDK 변천사

JAVA의 구린 GUI 역사

AWT• 크로스플랫폼• 각 운영체제의 네이티브 GUI 요소 프로그래밍 인터페이스 제공• 생각만큼 잘 동작하지 않았고 각 운영체제마다 미묘한 차이를 가짐

스윙• 네이티브를 사용하지 않고 자체적으로 드로잉하는 방식• 모든 플랫폼에서 동일한 효과• 덕분에 좋지 않은 성능

JavaFX (2.2 까지)• 플래시의 경쟁자라 자칭• JVM위에서 돌아가지만 자체적인 스크립트 언어로 인해 거부감을 줌

Page 41: JDK 변천사

그리고 JavaFX 8

• 람다와 결합된 비교적 간단한 사용

• 선언형 언어를 이용한 레이아웃 지정 (HTML, CSS, FXML)

• ARM 플랫폼 지원

• 스윙 컴포넌트와 친화력 강화

• 3D Graphics API 추가

• Canvas API

• Multi-touch 지원

• Hi-DPI 디스플레이 지원

Page 42: JDK 변천사

JAVA SE 8

• 람다

• 스트림 API

• JavaFX

• 나스혼 JS 엔진

• 그 외..

Page 43: JDK 변천사

잘 가 Rhino.

Page 44: JDK 변천사

새로운 인터프리터 나스혼 (Nashorn)

• 새로운 JVM 인스트럭션을 사용하여 효율적인 성능을 냄

• ECMAScript 표준을 잘 준수

• jjs 인터프리터와 자바 스크립팅 API를 제공

• 자바빈즈 프로퍼티, 리스트와 맵을 다루는 편리한 문법 제공

• 람다 표현식 사용과 유사한 방식으로 자바스크립트 함수를

자바 인터페이스로 변환 가능

Page 45: JDK 변천사

ScriptEngineManager manager = new ScriptEnginManager();ScriptEngine engine = manager.getEnginByName(“nashorn”);Object result = engine.eval(“’Hello, World!’.length”);System.out.println(result);

나스혼 실행

JAVA8과 함께 제공되는 jjs 명령행 도구 이용

JAVA6부터 제공한 스크립트 엔진 메커니즘 사용

Page 46: JDK 변천사

나스혼과 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!";

Page 47: JDK 변천사

그 외 몇 가지..

• Join 메서드 (Java8에 String 클래스에 추가된 유일한 메서드)

• Base64 표준 인코더/디코더 제공

• Annotation 개선

• 날짜/시간 API 개선

• JDBC 4.2 업데이트

Page 48: JDK 변천사