반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 9. try-finally보다는 try-with-resources를 사용하라
자바 라이브러리에는 close메서드를 호출해 직접 닫아줘야 하는 자원이 있다.
ex) InputStream, OutputStream, java.sql.Connection
직접 닫아주는 방법은 아래와 같다. (finalizer는 믿을만하지 않기 때문에 언급하지 않음. 이전 포스팅 참고)
1. try-finally
자원이 하나인 코드에서의 try-finally 코드는 나쁘지 않지만 자원이 두 개 이상부터는 지저분해지기 시작한다.
또한, 두 번째 예외가 첫 번째 예외를 집어삼킬 가능성이 있다.
→ 스택 추적 내역에 첫 번째 예외의 정보는 남지 않아 디버깅이 어려워짐
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[BUFFER_SIZE];
int n;
while ((n = in.read(buf)) >= 0)
out.write(buf,0,n);
} finally {
out.close();
}
} finally {
in.close();
}
}
2. try-with-resources
- 이 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야한다.
- 단순히 void를 반환하는 close 메서드 하나만 정의한 인터페이스이다.
(자바 라이브러리와 서즈파티 라이브러리들의 수많은 클래스와 인터페이스가 이미 AutoCloseable을 구현되어있음) - 여러 예외가 발생하는 경우 보여줄 예외 하나만 보존되고 나머지 예외들은 버려지지 않고 suppressed라는 꼬리표를 달고 출력한다.
(자바 7에서 Throwable에 추가된 getSuppressed 메서드를 이용해서 프로그램 코드를 가져올 수 있음)
아래의 코드는 위에 try-finally 코드를 try-with-resources 구조에 적용한 것이다.
static void copy(String src, String dst) throws IOException {
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);
}
}
정리
꼭 회수해야 하는 자원은 try-finally 보다는 try-with-resources를 사용하는 것이 좋다.
Why? 코드 가독성이 좋아지고 예외 정보도 훨씬 유용하다.
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 11. equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2022.09.12 |
---|---|
[Effective Java] 아이템 10. equals는 일반 규약을 지켜 재정의하라 (2) | 2022.09.11 |
[Effective Java] 아이템 8. finalizer와 cleaner 사용을 피하라 (0) | 2022.09.06 |
[Effective Java] 아이템 7. 다 쓴 객체 참조를 해제하라 (0) | 2022.09.05 |
[Effective Java] 아이템 6. 불필요한 객체 생성을 피하라 (0) | 2022.09.02 |