자원을 얻을 때에는 open() 메서드를 그리고 자원을 반납할 때 close() 메서드를 사용하게 된다.
특별한 처리가 없다면 입출력을 수행한는 도중 예외가 발생하면 스트림이 open 된 상태로 남겨진다.
자바에는 GC 가 존재하지만 GC 처리가 수행되기 전까지는 성능에 영향을 주게 된다. 따라서 Memory Leak 현상을 막기위해 자원 반납이 중요하다.
기존의 try-catch-finally 를 사용한 방법
FileOutputStream out = null;
try{
out=new FileOutputStream("test.txt");
} catch(FileNotFoundException e){
e.printStackTrace();
} finally{
if(out!=null)
{ try {
out.close(); //close 하다가 예외가 발생할 수 있다.
} catch (IOException e) {
e.printStackTrace();
}
}
}
try-with-resources 사용한 방법
try(FileOutputStream out = new FileOutputStream("test.txt")) {
//로직 구현
}catch(IOException e){
e.printStackTrace();
}
프로그래머가 보기에도 매우 직관적이고 실수할 경우를 줄여준다.
AutoCloseable 시에도 예외가 발생하는 경우
javaTest.IOException at
javaTest.MyResource.out(ExceptionTest_1.java:27) at
Suppressed: javaTest.CloseException at
javaTest.FileOutputStream.close(ExceptionTest_1.java:23) at
Suppressed 라는 문구를 붙여서 기존의 예외 로그랑 같이 넘어오게된다.
AutoCloseable 구현
class Test implements AutoCloseable{
public Test(){
}
@Override
public void close() throws Exception {
System.out.println("Test Close Exception");
}
}
public static void main(String[] args) {
try(Test test = new Test()){
}catch(Exception e){
}
}
try-with-resources
Item9 : try-finally 보다는 try-with-resources 를 사용하라
(Effective JAVA 3/E)
Josh Bloch 는 이펙티브 자바 저자이다.
왜 Close() 가 중요한가?
기존의 try-catch-finally 를 사용한 방법
try-with-resources 사용한 방법
AutoCloseable 시에도 예외가 발생하는 경우
AutoCloseable 구현