티스토리 뷰

자원을 정리하기 위한 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 인터페이스의 구현 필요성과 자원 정리 개념을 어떻게 정의할 것인지 잘 고민해 보아야 겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday