일반 객체를 소멸하는데는 GC만으로 충분하다. 그러나 외부 시스템 자원과 연동을 위해 InputStream, OuputStream, sql.Connection 등을 활용한다면 사용후 자원을 닫아주는 것이 필요하다. 이럴 때 try-with-resource를 활용할 수 있다.
try-with-resource는 try-finally보다 조금 더 업그레이드 버전이라 생각하면 된다. try-finally는 코드를 지저분하게 만드는데 비해 try-with-resource는 try 블럭 이전에 객체를 할당해서 명시해주기 때문에 훨씬 깔끔하다. 그리고 블럭 내부에서만 생존한다는 사실을 보다 직관적으로 알 수 있다.
class SolutionTest {
@Test
void test() throws Exception {
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)) {
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0) {
out.write(buf, 0, n);
}
}
}
}
위 코드 같이 2가지 이상의 자원을 해제할 때도 코드를 짧고 간편하게 짤 수 있다.