====== Java 7 ======
===== 예외 다중 캐치 =====
try {
// do something
} catch (Exception1 | Exception2 | Exception3 ex) {
ex.printStackTrace();
}
바(|)를 통해 여러가지 예외를 한번에 catch 할 수 있다.
===== try with resource =====
[[http://download.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html|java.lang.AutoCloseable]] 인터페이스를 구현한 리소스는 finally 블록에서 명시적으로 close()하지 않아도 자동으로 close()를 무조건 호출 할 수 있게 되었다.
과거에는 finally 블록에서 명시적으로 다음과 같이 close()를 호출해줘야만 리소스를 닫아줄 수 있었다.
// Java7 이전
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("C:/Windows/system32/drivers/etc/hosts"));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception ex) {
// ignored
}
}
}
위와 같은 코드가 Try With Resource 블록을 사용하면 아래와 같이 된다. **catch 블록이 없어도 된다는 사실에 주의. **
// Java7
try (BufferedReader reader = new BufferedReader(new FileReader("C:/Windows/system32/drivers/etc/hosts"))) {
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
}
try () 안에서는 세미콜론으로 구분하여 여러개의 리소스를 생성해도 된다.
===== 예외 다시 던질 때 예외 클래스 자동 판단 =====
catch 절에서 예외를 잡아서 다시 던질 때, Java 7 이전에는 catch 절에서 잡는 타입에 따라 해당 메소드의 throws 절이 결정되었었다.
public static class FirstException extends Exception {
}
public static class SecondException extends Exception {
}
public static void rethrowException(String msg) throws Exception {
try {
switch (msg) {
case "First":
throw new FirstException();
default:
throw new SecondException();
}
} catch (Exception ex) {
throw ex;
}
}
즉, rethrowException 메소드는 **catch (Exception ex)** 때문에 항상 **throws Exception**으로 선언되어야 했었다. 하지만 Java 7 부터는 try 블록에서 실제로 발생 가능한 예외를 컴파일러가 분석하여, catch 절과 무관하게 throws 할 예외 클래스를 지정할 수 있게 되었다.
다음과 같이 ''FirstException''과 ''SecondException''을 명시해 주는게 가능해 진다.
public static void rethrowException(String msg) throws FirstException, SecondException {
try {
switch (msg) {
case "First":
throw new FirstException();
default:
throw new SecondException();
}
} catch (Exception ex) {
throw ex;
}
}
===== String switch =====
문자열을 switch/case 구문에 사용할 수 있게 되었다.
Console console = System.console();
String value = console.readLine("입력 : ");
switch(value) {
case "A":
System.out.println("A");
break;
case "B":
System.out.println("B");
break;
case "some":
System.out.println("some");
break;
default:
System.out.println("Don't know...");
}
===== Diamond Operator =====
Generic 객체를 생성할 때 선언이 올바로 되어 있으면 객체 생성 구문에서 제너릭타입을 지정하지 않고 ''<>'' 만 사용해도 된다.
public static void main(String[] args) throws Exception {
// 앞부분의 선언 때문에, 객체 생성 구문에서는 제너릭 타입 지정 불필요
List strings = new ArrayList<>();
}
public static Map getValues() {
// 메소드 선언의 제너릭타입 지정 때문에, return 문에서도 Diamond Operator 사용 가능
return new HashMap<>();
}
===== 이진수 지원 =====
byte,short,int,long 형을 ''0B숫자''를 사용해 이진수로 표현할 수 있다. [[http://download.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html|Binary Literals]]
int binary = 0B10;
System.out.println(binary); // 2
binary = 0B11111111;
System.out.println(binary); // 255
===== 숫자에 밑줄 가능 =====
숫자값에 밑줄(_)을 써도 되며 밑줄은 그냥 무시된다. 숫자의 가독성을 높이는데 사용하면 된다.
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
===== java.util.Objects 클래스 =====
* [[http://download.oracle.com/javase/7/docs/api/java/util/Objects.html|java.util.Objects]] 클래스의 다양한 정적 메소드들은 코드량을 줄여준다.
* [[http://download.oracle.com/javase/7/docs/api/java/util/Objects.html#equals%28java.lang.Object,%20java.lang.Object%29|equals]] null에 안전한 equals 를 구현한다.
===== java.nio.file.Files 클래스 =====
* [[http://download.oracle.com/javase/7/docs/api/java/nio/file/Files.html|java.nio.file.Files]]는 파일 관련한 복사, 경로 관리등 다양한 정적 메소드들을 제공해준다.
* [[java:7:files|Java 7 Files]]에서 자세히 볼 수 있다.
===== MethodHandles =====
MethodHandle을 사용하면 메소드를 객체로 전달하는 것이 가능해진다. [[http://vanillajava.blogspot.com/2011/08/methodhandle-performance-in-java-7.html|Vanilla Java: MethodHandle performance in Java 7]]를 참조하였다.
아래는 multiply 메소드를 MethodHandle 객체로 만든 뒤에 해당 메소드를 호출하는 것을 보여준다.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import java.lang.invoke.MethodType;
public class Java7Test {
public static int multiply(int i, int j) {
return i * j;
}
public static void main(String[] args) throws Throwable {
Lookup lookup = MethodHandles.lookup();
MethodHandle multiply = lookup.findStatic(Java7Test.class, "multiply", MethodType.methodType(int.class, int.class, int.class));
System.out.println(multiply.invoke(5,6)); // multiply(5,6) 호출
// 1번 인자로 4를 미리 지정해둔다.
MethodHandle quadruple = MethodHandles.insertArguments(multiply, 1, 4);
System.out.println(quadruple.invoke(5)); // multiply(4,5) 호출
}
}
===== ThreadLocalRandom =====
* [[https://docs.oracle.com/javase/7/docs/api/java/util/Random.html|Random]]을 멀티쓰레드로 접근하면 ''synchronized'' 때문에 성능이 저하됨.
* 쓰레드별로 Random 객체를 따로 생성하는 [[https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html|ThreadLocalRandom]]을 사용하면 된다.
// 대부분 아래와 같은 형태로 사용하면 된다.
ThreadLocalRandom.current().nextX(...)
* [[http://java-performance.info/java-util-random-java-util-concurrent-threadlocalrandom-multithreaded-environments/|java.util.Random and java.util.concurrent.ThreadLocalRandom in multithreaded environments - Java Performance Tuning Guide]]
===== 기타 =====
* 모든 Reflection 관련 예외들은 [[http://download.oracle.com/javase/7/docs/api/java/lang/ReflectiveOperationException.html|java.lang.ReflectiveOperationException]]를 상속하도록 되었다.
* [[http://download.oracle.com/javase/7/docs/api/java/lang/Byte.html#compare%28byte,%20byte%29|Byte]], [[http://download.oracle.com/javase/7/docs/api/java/lang/Character.html#compare%28char,%20char%29|Character]], [[http://download.oracle.com/javase/7/docs/api/java/lang/Short.html#compare%28short,%20short%29|Short]], [[http://download.oracle.com/javase/7/docs/api/java/lang/Integer.html#compare%28int,%20int%29|Integer]], [[http://download.oracle.com/javase/7/docs/api/java/lang/Long.html#compare%28long,%20long%29|Long]] 에 static compare(x,y) 메소드가 추가되었다. 박싱 오버헤드 없이 원시값을 비교할 수 있게 되었다.
* [[http://java.dzone.com/articles/jdk-7-additions-currency-class|Java 7 Currency]]
* [[http://weblogs.java.net/blog/fabriziogiudici/archive/2012/05/07/understanding-subtle-new-behaviours-jdk-7|Understanding subtle new behaviours of JDK 7]] - JDK 7과 AspectJ 구 버전을 사용할 경우 Bytecode Verifier에 문제가 발생할 수 있다. ''-XX:-UseSplitVerifier'' 옵션을 주면 일단 넘어갈 수 있다.
* [[http://java.dzone.com/articles/java-7-how-write-really-fast|Java 7: How to write really fast Java code]]
* [[http://java.dzone.com/articles/java-7s-support-suppressed|Java 7 Support for suppressed exceptions]]
* [[http://java.dzone.com/articles/java-7-complete-invokedynamic|Java 7: A complete invokedynamic example]]
* [[http://java.dzone.com/articles/garbage-collection-automatic|Garbage Collection with Automatic Resource Management in Java 7]]
===== 참조 =====
* [[http://www.slideshare.net/boulderjug/55-things-in-java-7|55 New Features in Java 7]]
* [[http://code.google.com/p/java7examples/|java7examples - Documentation and examples for new Java 7 features]]
* [[http://java.dzone.com/articles/java-7-small-language-changes|Java 7 Small Language Changes Screencast | Javalobby]]
* [[http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7|Java Programming Language Enhancements]]
* [[http://blogs.oracle.com/darcy/entry/jdk_7_library_treats|JDK 7: Small Library Treats (Joseph D. Darcy's Oracle Weblog)]]
* [[http://jaxenter.com/java-7-the-top-8-features-37156.html|Java 7: The Top 8 Features]]
* [[http://www.hanb.co.kr/network/view.html?bi_id=1780|[한빛 네트워크] Java 7의 새로운 특징 : Java7에서의 중요한 변화들과 업데이트된 항목에 대한 조사.]]
* [[http://java.dzone.com/articles/java-7-understanding-phaser|Java 7: Understanding the Phaser]]