티스토리 뷰
자원을 정리하기 위한 try-finally 구문
자바 라이브러리에는 close 메서드를 호출해 직접 닫아주어야 하는 자원이 많다. (In/OutputStream, java.sql.Connection 등) 자원 닫기는 클라이언트가 놓치지 쉬워서 예측할 수 없는 성능문제로 이어지기도 한다. 전통적으로 자원을 닫기 위한 수단으로 try-finally 구문을 활용했다.
BufferedReader br = new BufferedReader(new FileREader(filePath));
try {
return br.readLine();
} finally {
br.close();
}
위 코드에서 기기에 물리적 결함이 발생하는 경우, readLine 메서드와 close 메서드는 모두 실패하게 된다. 이 때 첫 번째 발생한 예외는 남지 않게되어 시스템에서의 디버깅이 어려워진다.
AutoCloseable 구현과 try-with-resources 구문 사용
자바 7에서 try-with-resource 구문이 정의되었다. 이 구조를 사용하려면 사용대상 자원에 AutoCloseable 인터페이스를 구현해 주어야 한다. 이 구문은 다음과 같이 활용할 수 있다
try (InputStream in = new FileInputStream(source);
OutputStream out = new FileOutputStream(destination)) {
byte[] buffer = new byte[BUFFER_SIZE];
int n;
while ((n=in.read(buf)) >= 0)
out.write(buf, 0, n);
}
이 구문에서는 try 예약어 다음에 소괄호를 기술하고, 자원 해제 대상을 미리 선언해 주어야 한다. 이후 중괄호 블록의 종료 후에 AutoCloseable 인터페이스의 close 메서드를 호출해서 자원을 정리할 수 있도록 해준다.
위 코드의 read 메서드에서 예외가 발생하는 경우, close 메서드의 예외는 숨겨진다. (숨겨진 예외들도 그냥 버려지지 않고 스택 추적 내역에 숨겨졌다는 표현으로 출력된다.)
보통의 try-finally 처럼 try-with-resources 구문에서도 catch 절을 작성할 수 있다.
정리
최근에는 자바 7 미만의 버전을 사용하는 라이브 시스템은 거의 없는 것 같다. try-with-resources 구문은 이미 충분히 대중화되었다. 내가 설계할 클래스에 AutoCloseable 인터페이스의 구현 필요성과 자원 정리 개념을 어떻게 정의할 것인지 잘 고민해 보아야 겠다.
'프로그래밍 > Effective Java' 카테고리의 다른 글
아이템 11. equals를 재정의하려거든 hashCode도 재정의하라 (1) | 2024.07.14 |
---|---|
아이템 10. equals는 일반 규약을 지켜 재정의하라 (0) | 2024.07.07 |
아이템 8. finalize와 cleaner 사용을 피하라 (0) | 2024.07.07 |
아이템 7. 다 쓴 객체참조를 해제하라 (0) | 2024.07.07 |
아이템 6. 불필요한 객체 생성을 피하라 (0) | 2022.02.24 |
- Total
- Today
- Yesterday