아직도 1.5버전을 사용하는 개발자가 많은데 JDK 7 에 대해서는 많은 부분이 진행중입니다.
저도 최근에서야 JDK 6을 사용하고 있는데 말이죠.
Devoxx 컨퍼런스에서 JDK에 변경사항에 대한 설문조사를 진행한 것으로 보입니다.
간단히 살펴보도록 하겠습니다.
# 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());
}
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변수에 할당된 문자열을 제거하고자 한다.
}
}
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");
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>>();
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) {
}
try {
} catch (IOException,SQLException ex) {
}
여러개의 예외처리보다는 한꺼번에 처리하고자 할때는 간단히 처리하기 위한 지원입니다.
# String switch
String str = ...
if (str.equals("name")) {
} else if (str.equals("surname")) {
} else if (str.equals("forename")) {
}
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;
String name = ...
int value = ...
String out = $"The value of ${name} is ${value}";
문자열 연산을 하면 아무래도 코드를 좀더 쉽게 처리할수도 있겠네요.
# Multi-line Strings
String sql =
"SELECT surname, forename, title " +
"FROM person";
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) {}
}
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();
}
}
}
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