..
try-with-resources: 자바의 우아한 자원 관리법
1. 개요 (Overview)
자바에서 파일 입출력, 데이터베이스 연결, 네트워크 소켓 등 외부 자원(Resources)을 다룰 때는 사용이 끝난 후 반드시 자원을 닫아주어야(Close) 합니다. 이를 게을리하면 메모리 누수나 파일 잠김 등의 심각한 문제가 발생할 수 있습니다.
기존의 번거로웠던 finally 블록 기반의 자원 해제 방식을 개선하여, 자바 7부터는 훨씬 간결하고 안전한 try-with-resources 문법을 제공합니다.
2. try-with-resources란?
AutoCloseable 인터페이스를 구현한 객체를 try() 괄호 안에 선언하기만 하면, 블록이 끝날 때 자동으로 close()를 호출해 주는 문법입니다.
3. 코드 비교 (Before vs After)
AS-IS (전통적인 방식)
finally 블록에서 일일이 null 체크를 하며 명시적으로 닫아주어야 하며, 이 과정에서도 또 다른 예외 처리가 필요하여 코드가 지저분해집니다.
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
TO-BE (Modern Java)
문법이 비약적으로 간소화되며, 예외 발생 여부와 상관없이 자원 해제를 보장합니다.
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
System.out.println(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
4. 지원 가능한 객체 타입
모든 객체가 가능한 것은 아니며, 반드시 AutoCloseable 또는 그 하위 인터페이스인 Closeable을 구현하고 있어야 합니다.
- 지원 클래스 예시:
BufferedReader,FileInputStream,Scanner,Connection(DB),PreparedStatement등
여러 개의 자원을 동시에 선언할 수도 있으며(세미콜론 ;으로 구분), 이 경우 자원들은 선언된 역순으로 차례차례 안전하게 닫힙니다.