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 문을 구현하여 원하는 에러에 처리할 로직을 추가하는 것도 가능하다.