..

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

여러 개의 자원을 동시에 선언할 수도 있으며(세미콜론 ;으로 구분), 이 경우 자원들은 선언된 역순으로 차례차례 안전하게 닫힙니다.