Search

Item 9. try-finally보다는 try-with-resources를 사용하라

생성일
2023/07/27 10:35
챕터
2장 - 객체 생성과 파괴

try-fianlly 한계

자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등 직접 close 메서드를 호출해 닫아주어야 하는 자원들이 많다.
전통적으로 이런 자원들에 대해서는 try-finally를 통해 해당 자원에 대해 닫아주도록 코드를 구현하는데, 아래와 같이 자원을 2개 이상 사용하는 경우 코드가 굉장히 지저분해진다.
static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] buf = new byte[16]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally { out.close(); } } finally { in.close(); } }
Java
복사
만약 throws로 IOException을 전파하지 않고 catch로 직접 잡겠다 하면, 코드는 훨씬 복잡해진다. 그냥 catch 문이 추가되는 것 외에도 close에서도 IOException이 발생할 수 있으니 해당 부분도 try-catch로 잡아주어야하기 때문이다.

try-with-resources

자바 7부터 try-with-resources 기능이 추가되어 이러한 자원들을 처리하는 과정이 간단해졌다.
아래처럼 AutoCloseable 인터페이스를 구현한 자원에 대해 try의 조건문에 넣으면 스코프를 벗어날 때 자동으로 자원을 닫고 회수한다.
static void copy(String src, String dst) throws IOException { try ( InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst); ) { byte[] buf = new byte[16]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } }
Java
복사
추가적으로 catch 문을 구현하여 원하는 에러에 처리할 로직을 추가하는 것도 가능하다.