자바(SE)

[Java]버전 별 특징 JDK 09

은서파 2023. 5. 19. 13:42

이번 포스트에서는 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

 

[java]try~with~resource의 close 호출 시점

이번 포스트에서는 try~with~resource에서 resource의 close 시점에 대해 살펴보자. try~with~resource resource의 자동 close try~with~resource 문장은 AutoCloseable 한 resource를 대상으로 사용이 끝나면 자동으로 close()를

goodteacher.tistory.com

 

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을 수정하지 못하도록 할 수 있다.