====== 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]]