Java 라이브러리에서는 close()
를 사용하여 직접 닫아줘야 하는 자원이 많습니다.
좋은 예시로 입/출력을 담당하는 InputStream
, OutputStream
과 DB의 Connection을 제어하는데 사용하는 java.sql.Connection
가 있습니다.
만약 이런 자원들을 닫아주지 않으면 어떤 일이 일어날까요?
OutOfMemeory
에러가 발생하게 될 것입니다.이러한 일을 예방하기 위해서 이전 Item에서 finalizer 및 cleaner를 사용해 안전망을 구축할 수 있다는 것을 알고 계실 것입니다. 하지만 이런 안전망 역시 완벽하게 잡아줄 수 있다고는 할 수 없습니다.
<aside> 💡 자원(Resources)이란?
</aside>
Connection
, 입 출력에 사용되는 Stream
, Thread
도 자원이라는 개념에 포함됩니다.static String firstLineOfFile(String path) {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} catch(IOException e) {
e.printStackTrace();
} finally {
br.close();
}
}
catch
에서 잡혔든 상관없이 항상 br.close()
를 실행하도록 하여 반드시 자원을 닫도록 구현하고 있습니다.static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dst);
try {
byte[] buffer = new byte[BUFFER_SIZE];
int n;
while((n = in.read(buffer)) >= 0) {
out.write(buffer, 0, n);
}
} finally {
out.close();
}
} finally {
in.close();
}
}
out.close()
메서드를 실행하는 도중에도 예외가 발생할 수 있기 때문입니다.