Akashic Records

Introduction of JDK 7 본문

오래된글/Articles

Introduction of JDK 7

Andrew's Akashic Records 2018. 4. 19. 14:09
728x90

JDK 7 Version Plan

 Project Coin (JSR TBD)

 InvokeDynamic (JSR 292)

 Fork/Join Framework

 Mid 2011

  • Strict Verification

  • Parallel Class Loaders

  • Transfer Queues

  • Phasers

  • Unicode 6.0

  • Swing Nimbus

  • XRender Pipeline

  • ECC

  • Swing J Layer

  • More New I/O (J SR 203)

  • JDBC 4.1

  • TLS 1.2

  • Enhanced Locales

  • SDP & SCTP


JDK 8 Version Plan

 Project Jigsaw

 Project Lambda

 Late 2012

  • Type Annotations (JSR 308)

  • Bulk-Data Operations

  • Swing J DatePicker

  • Collection Literals


오라클은 Lambda, Jigsaw, Coin의 일부 기능을 제거한 JDK 7를 2011년 중반에 출시하고 나머지 기능 + Alpha를 2012년에 JDK 8으로 출시한다는 계획이다.


JDK 7’s New Features


1. G1 Garbage First Collector

서버 측 JVM 에서 주로 사용되던 CMS (Concurrent Mark-Sweep) collector를 대신 할 새로운 방식의 collector. 기존 방법보다 GC에 의한 pause time을 줄이고 JVM 성능에 대한 예측을 더 정확하게 할 수 있도록 한다. 이 기능은 실험적으로 Java SE 6 u14 버전에 포함되었다.


2. Java외의 다른 언어 지원 (invokeDynamic)

이미 Java VM 에서 실행되는 여러 개발언어가 있다. JDK 7은 Java 언어 외 다른 개발언어도 Java 언어와 거의 같은 성능으로 Java VM 에서 수행될 수 있도록 한다.

JVM은 사실 java 언어와는 아무런 연관이 없다. JVM은 언어에 대해서는 아무것도 모르며 단지, byte 코드와 기타 정보를 가진 class 파일 포맷에 대해서만 알고 있다는 것이다. Java언어가 아니라도 JVM 스팩에서 정의한 클래스 포맷과 byte 코드 명령어 규칙을 따르기만 하면 JVM에서 실행할 수 있다.


현재 JDK 6에서 지원하고 있는 외부 언어

  • Jruby – Java로 구현한 Ruby

  • Jython – java로 구현한 Python

  • Groovy – JVM에서 실행되는 새로운 동적 스크립트 언어

  • Rhino – Java로 구현한 JavaScript

  • JavaFX – Oracle이 RIA를 위해 새로 만든 언어

  • Mirah – Ruby와 유사한 문법의 정적 타입 언어


기존 JVM에서의 동적 스크립트 언어 지원 문제

Java는 정적형 언어다. 객체든 변수든 사용하기 위해서는 프로그램 코드에  Type을 지정해 주어야 한다. 어떤 메쏘드를 호출하기 위해서는 메쏘드를 가진 객체, 메쏘드의 인자 값, 반환 값까지 어떤 Object Type인지 알고 있어야 한다. 이와 달리 Ruby와 같은 동적 스크립트 언어는 메쏘드를 호출하기 위해 객체의 Type이 무엇인지 몰라도 상관 없다.

JDK 7의 JVM에서는 “invokedynamic”명령어를 추가하여 동적 스크립트 언어가 Java 언어와 거의 같은 성능을 낼수 있도록 한다. “invokedynamic”은 기존의 “invokevirtual”,”invokeinterface”와 달리 메쏘드 호출을 위해 클래스 정보가 필요하지 않다. 호출할 메쏘드의 이름과 선언 형식만 제공하면 런타임에 적절한 메쏘드를 호출 할수 있다.


3. Java 프로그래밍 언어 사용을 편리하게 (Project Coin)

JDK 7은 Java 프로그래밍 언어에 코딩을 편하게 하는 기능들을 제공한다. Project Coin은 JDK 7추가될 작은 언어(Java)적 변화를 결정하는 프로젝트다.


Strings in switch

String Type Switch 문에 사용할수 있게

현재

String str = ...

if (str.equals("name")) {

} else if (str.equals("surname")) {

} else if (str.equals("forename")) {

}

JDK 7

String str = ...

switch (str) {

   case "name":

break;

   case "surname":

break;

   case "forename":

break;

}


Map for-each

현재

Map<String, Integer> map = new HashMap<String, Integer>();

for (Entry<String, Integer> entry : map.entrySet()) {

System.out.println(entry.getKey() + "=" + entry.getValue());

}

JDK 7

Map<String,Integer> map = new HashMap<String, Integer>();

for (String key, Integer value : map) {

System.out.println(key + "=" + value);

}


For-each iteration control

현재

List<String> list = new ArrayList<String>();

for (String str : list) {

if (str.length() > 100) {

// str변수에 할당된 문자열을 제거하고자 한다.

}

}

JDK 7

List<String> list = new ArrayList<String>();

for (String str : list : it) {

if (str.length() > 100) {

   it.remove();

}

}


List/map access

현재

List<String> list = ...

Map<String,Integer> map = ...

Map<String,Map<String,Task>> combined = ...


String str = list.get(0);

list.set(0, "Hi");


Integer value = map.get(str);

map.put("Hi", 56);


Task task = combined.get("Test").get("Monitor");

JDK 7

List<String> list = ...

Map<String,Job> map = ...

Map<String,Map<String,Task>> combined = ...


String str = list[0];

list[0] = "Hi";


Integer value = map[str];

map["Hi"] = 56;


Task task = combined["Test"]["Monitor"];


Infer generics in declarations

현재

List<String> list = new ArrayList<String>();

Map<String,Job> map = new HashMap<String,Job>();

Map<String,Map<Channel,Job>> map = new HashMap<String,<Channel,Job>>();

JDK 7

List<String> list = new ArrayList<>();

Map<String,Job> map = new HashMap<>();

Map<String,Map<Channel,Job>> map = new HashMap<>();


String interpolation

현재

String name = ...

int value = ...

String out = "The value of "+ name + " is " + value;

JDK 7

String name = ...

int value = ...

String out = $"The value of ${name} is ${value}";


Multi-catch of Exceptions

현재

try {

doWork(file);

} catch ( IOException ioe ) {

logger.log(ioe);

throws ioe;

} catch ( SQLException sqle ) {

logger.log(sqle);

throws sqle;

}

JDK 7

try {

doWork(file);

} catch ( final IOException | SQLException ex ) {

logger.log(ex);

throws ex;

}


Multi-line Strings

현재

String sql =

"SELECT surname, forename, title " +

"FROM person";

JDK 7

String sql =

"""SELECT surname, forename, title

FROM person""";


Resource management

현재

String sql =

File file = ...

FileReader in = null;

try {

in = new FileReader(file);

processFile(in);

} finally {

try {

if (in != null) {

in.close();

}

} catch (IOException ignored) {}

}

JDK 7

File file = ...

try (FileReader in = new FileReader(file)) {

processFile(in);

}


Null-handling

현재

Session sess = ...

String code = null;

if (sess != null) {

if (sess.person() != null) {

if (sess.person().address() != null) {

code = sess.person().address().postcode();

}

}

}

JDK 7

Session sess = ...

String code = sess?.person()?.address()?.postcode();



4. Lambda (Closure) 지원

요즘 사용하는 대부분의 desktop, laptop 컴퓨터는 이미 멀티 코어 CPU가 기본으로 사용되고 있다. 앞으로는 모바일 장치에서도 멀티 코어 CPU가 사용될 수도 있을 것이다. Java 개발자들이 손쉽게 멀티 코어 CPU의 이점을 활용할 수 있도록 JDK 7에서는 Closure를 지원할 예정이다.

For loop – External Iteration

double highestScore = 0.0;

for (Student s : students) {

if ((s.gradYear == 2010) {

if(s.score > highestScore)){

highestScore = s.score;

}

}

}

Hypothetical Internal Iteration

double highestScore = students

.filter (new Predicate<Student>() {

public boolean isTrue(Student s) {

return s.gradYear == 2010;

}})

.map (new Extractor<Student,Double>() {

public Double extract(Student s) {

return s.score;

}})

.max ();

Introducing Lambda expressions

double highestScore = students

.filter(#{ Student s -> s.gradYear == 2010 } )

.map(#{ Student s -> s.score } )

.max();


Lambda expressions introduced with #

  • Signal to the JVM to defer execution of the code

  • Zero or more formal parameters

  • Body may be an expression or statements

    • If body is an expression, no need for „return‟ or „;‟

Lambda expression are not syntactic sugar for anonymous inner class

  • Implemented with MethodHandle from JSR-292



5. SDP, SCTP 프로토콜 지원

Telco에서 많이 사용하는 SDP (Sockets Direct Protocol), SCTP (Stream Control Transmission Protocol)을 지원한다.



6. ECC (Ecliptic Curve Cryptography)

RSA 알고리즘보다 더 효율적인 ECC 알고리즘을 제공한다.



7. 새로운 Swing Look & Feel - Nimbus

Swing Look & Feel에 Nimbus L&F을 추가로 제공한다. Nimbus L&F은 정적인 비트맵을 사용하지 않고 2D 그래픽 API로 구현되어 어떤 해상도에서도 최적의 UI를 보여준다.


728x90
Comments