본문 바로가기

STUDY/이펙티브자바

2-9) try-finally 보다는 try-with-resources를 사용하라

자원 반환을 위한 try문

 

Java 프로그램을 만들다보면 자원을 사용하고 반환해야하는 경우가 많다. 심지어 해당 자원에 lock을 걸고 점유하며 사용한다면 반드시 사용 이후에 lock을 풀고 자원을 반환해야 한다. 이를 위해서 InputStream, OutStream의 경우 close() 메소드로 자원을 반환하도록 한다.

 

InputStream is = new FileInputStream("temp.txt");
... is 사용하는 코드들 ...
is.close();

위의 코드는 temp.txt 파일을 읽어들이는 InputStream을 만들고 사용한 후에 close() 메소드를 호출한다. 이렇게하면 is가 사용된 이후 자원을 반환할 수 있다. 정말일까? is 사용하는 중간 코드에서 Exception이 발생한다면 어떻게 될까? 그럼 이후의 코드는 모두 무시되고 close() 메소드는 호출되지 않는다.

 

try {
    InputStream is = new FileInputStream("temp.txt");
    ... is 사용하는 코드들 ...
}
catch (Exception e) {
	...
}
finally {
    is.close();
}

그래서 close가 어느 경우에도 호출될 수 있도록 try문을 사용한다. is를 사용하는 코드에서 예외가 발생하여도, 예외가 발생하지 않아도 모든 경우에 실행되는 finally 구문에서 close를 호출한다.

 

 


try-with-resources

 

try (InputStream is = new FileInputStream("temp.txt");) {
    ... is 사용하는 코드들 ...
}
catch (Exception e) {
	...
}

try-finally는 close의 호출을 보장하지만, 코드의 가독성이 떨어진다는 단점이 있다. Java 7에서 더욱 가독성이 좋고 사용도 편리한 try-with-resources 구문을 추가하였다. 이 구문에 AutoCloseable의 구현제를 사용하면 try문이 끝날 때, 개발자가 별도로 호출하는 코드를 작성하지 않아도 close 메소드를 호출한다. 따라서 Java 7 이후에는 try-with-resources 구문을 사용하는 자원의 반환이 권장된다.

728x90