[Java]버전 별 특징 JDK 09
이번 포스트에서는 JDK의 버전별 특징에 대해서 살펴보자. 여러가지 특징들이 많겠지만 프로그래밍 하면서 자주 사용되는 것들만 할 계획이다.
JDK 9
Try With Resources 문장 개선
기존의 Try With Resources는 autoclose되는 항목이 try 문장에 선언되어있어야 했다. 따라서 외부에서 전달받은 객체는 사용이 불가했다.
private void jdk8(FileOutputStream output) {
try (InputStream input = System.in) {
int read = input.read();
output.write(read);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (output != null) {
output.close();
}
} catch (IOException ignore) {
}
}
}
하지만 JDK 9에서는 외부의 변수를 등록할 수 있게 되어 진정한 try~with~resources 문장이 가능해졌다.
private void jdk9(FileOutputStream output) {
try (InputStream input = System.in; output;) {
int read = input.read();
output.write(read);
// Local variable output defined in an enclosing scope must be final or effectively final
//output = new FileOutputStream("test");
} catch (IOException e) {
e.printStackTrace();
}
}
주의할 점은 이런 변수는 final이거나 effectively final이므로 새로 read only로 사용해야 한다.
또한 auto close가 호출되는 시점은 try 블록 내부임을 주의해야 한다.
https://goodteacher.tistory.com/739
inner class에서 Diamond Operator 사용
Generic을 사용하면서 등호 우변의 <>에는 타입을 생략할 수 있다.
List<String> list = new ArrayList<>();
하지만 JDK 1.8 까지는 inner class에서는 생략할 수가 없었다.
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
JDK 9에서는 inner class에도 <>를 사용할 수 있게 되었다.
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
interface에 private method 추가 가능
interface에는 JDK8에 추가된 default 메서드나 static 메서드를 통해서 body를 가진 메서드를 작성할 수 있었는데 여러 메서드에서 내부적으로 재활용되는 기능이 있을 때 처리가 애매했다.
JDK9에서는 interface에 구현부가 있는 private method를 추가할 수 있게 되었다.
interface MyMath {
static void add(int a, int b) {
int result = a + b;
print(a, b, '+', result);
}
default void multi(int a, int b) {
print(a, b, '*', a * b);
}
private static void print(int num1, int num2, char oper, int result) {
System.out.println("%d %c %d = %d".formatted(num1, oper, num2, result));
}
}
public class PrivateMethodTest {
public static void main(String[] args) {
MyMath.add(10, 20);
}
}
Unmodifiable Collection 생성
기존에는 수정이 불가한 collection을 작성하기 위해 여러 줄의 코드를 사용했지만 of 라는 메서드르 이용해 간편히 추가할 수 있게 되었다.
// 기존
List<String> originalList = new ArrayList<>();
originalList.add("Apple");
originalList.add("Banana");
originalList.add("Cherry");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
// JDK 9부터 가능
List<String> list = List.of("Hello", "Java", "World");
Set<String> set = Set.of("Hello", "Java", "World");
Map<String, String> map = Map.of("lang","Java", "ver", "JDK 9");
참고로 unmodifiable collection은 기존 컬렉션을 수정할 수 없도록 만든 뷰의 개념으로 원본 컬렉션의 변경을 방지하기 위해 사용된다. 이를 통해 Collection을 안전하게 공유하고 다른 사용자가 Collection을 수정하지 못하도록 할 수 있다.