JDK 7.0에 새롭게 추가될 & 추가되고싶은 기능들

2009. 1. 23. 09:10Java

http://www.javaworld.com/javaworld/jw-12-2008/jw-12-year-in-review-2.html?page=3 를보면
이번 새롭게 JDK7에 추가될 여러가지 기능들에 대해 리뷰글이 있습니다.

간단하게 보면,

- JDK 모듈화
  패키지 선언 앞쪽에 module 키워드를 적용하는 겁니다.
  음 예로 말하자면,
   public 으로 선언되지 않은 interface 를 다른 패키지에서 이를 구현하고 싶은 경우
   원래는 레벨권한으로 안되죠. 근데 이 module 이란 키워드를 이용해서 해당 클래스에서 이를 할수 있게
   해주는것 같습니다.

- 새로운 NIO2 적용
   : 파일관련(파일 이동,생성) 해서 NIO로 쉽게 할수 있게 되는것 같네요. 원문을 참고~

-Date 와 Time에 API 추가
   : 두 시간사이의 간격이라든지, 해당 시간이 그 시간사이에 있다라든지..
     별로 많이 사용하지 않는 기능이군요. ==

- 주석추가 기능(Annotations)
  
// A more precise class definition:
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
// A more precise variable declaration:
List<String> str = new @NonEmpty @Readonly ArrayList<String>(stringSet);

 
- JMX 업데이트 : 별로.. --

-

아래는 새로운 기능들에 대한 설문조사 결과

http://www.java.net/pub/pq/240

Poll Results

Which of these excluded-from-Java-7 features were you most interested in?

Closures  46.6% (856 Votes)
Reified generics  17.5% (321 Votes)
First-class properties  10.1% (187 Votes)
Operator overloading  4.5% (84 Votes)
BigDecimal syntax  4% (75 Votes)
JSR-295 Beans Binding  7.4% (137 Votes)
I wasn't interested in any of these  9.4% (174 Votes)

Total Votes: 1834

View Previous Polls



=========================================================================================

아래는 서비스로~
아래의 내용은 이동국님의 블로그의 내용입니다. 좋은 내용이네요~
http://blog.openframework.or.kr/75

# 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"];

get메서드 대신에 일종에 배열처럼 또는 다른언어에서 제공하는 것처럼 지원하고자 하나 봅니다.


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

실제 객체를 생성하는 부분에서 제네릭 타입을 명시하지 않는다면 선언부의 값을 그대로 사용한다는 것입니다.


# Multi-catch of Exceptions

  • 현재
try {

} catch (IOException ex) {
} catch (SQLException ex) {
}
  • JDK 7  => 좋네요.
try {

} catch (IOException,SQLException ex) {
}

여러개의 예외처리보다는 한꺼번에 처리하고자 할때는 간단히 처리하기 위한 지원입니다.


# String 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;
}

이거보고 순간 멈찟 했는데 Java는 String타입에 대한 switch..case 구문을 지원하지 않고 이 부분에 대한 지원입니다.


# String interpolation

  • 현재
String name = ...
int value = ...
String out = "The value of "+ name + " is " + value;
  • JDK 7  => 이건 좋네요. 안의 String 연산이 StringBuffer처럼 되어 있다면 말이죠.
String name = ...
int value = ...
String out = $"The value of ${name} is ${value}";

문자열 연산을 하면 아무래도 코드를 좀더 쉽게 처리할수도 있겠네요.


# Multi-line Strings
  • 현재
String sql =
"SELECT surname, forename, title " +
"FROM person";
  • JDK 7  => 이건 좀 지저분 하네요.
String sql =
"""SELECT surname, forename, title
FROM person""";

groovy나 다른 많은 언어에서 지원하는 형태인데 Java에서도 가져오는군요.


# Resource management
  • 현재  => 굿이네요.
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();

코드 전반에 걸쳐서 존재하는 많은 null 체크가 사라질수 있을듯 합니다.



상세한 결과물은 http://www.jroller.com/scolebourne/entry/jdk_7_language_changes_devoxx 에서 확인가능합니다. 결과만 보면 Infer generics in declarations, Multi-catch of Exceptions, Null-handling 에 대해서는 많은 점수를 주고 있습니다.

주의하셔야 할 것은 이 내용들이 모두 JDK 7에 반영되는 내용은 아닙니다. 설문조사니까 그래도 많은 부분이 반영은 되겠죠..??

참고자료
1. PPT : http://docs.google.com/Present?docid=ajkb8rnkwjk5_165g8wpxhf5
2. 설문조사 결과 페이지 : http://www.jroller.com/scolebourne/entry/jdk_7_language_changes_devoxx