EdgeSecu

JAVA try-with-resources(자동 자원 해제) 본문

공부/JAVA

JAVA try-with-resources(자동 자원 해제)

Edgemine 2025. 5. 13. 23:09

1. 개념 및 목적

  • 자원(Resource): 파일, DB 연결, 네트워크 소켓 등 사용 후 반드시 닫아야 하는 객체
  • 문제점: 전통적 try–catch–finally에서 close()를 직접 관리해야 함
  • 해결책: try(...) 선언부에 자원을 열어두면 블록 종료 시 자동으로 close() 호출 → 코드 간결·안정성↑

2. 기본 문법

try (ResourceType res = new ResourceType(...)) {
    // 자원 사용 코드
} catch (IOException e) {
    // 예외 처리
}
  • ResourceTypeAutoCloseable(또는 Closeable) 구현
  • 여러 자원 동시 관리: 세미콜론(;) 구분
    try (
      FileInputStream fis = new FileInputStream("file.txt");
      BufferedReader br = new BufferedReader(new InputStreamReader(fis))
    ) {
      // fis, br 모두 자동 close()
    }

3. 동작 원리

  1. 리소스 초기화: try(...)에서 선언·생성
  2. 블록 실행: 정상/예외 상관없이 내부 코드 실행
  3. 자동 해제: 블록 종료 시 선언된 자원을 역순으로 close() 호출
  4. 예외 처리
    • 블록 실행 예외 → catch로 전파
    • close() 예외 → 억압된 예외(suppressed exception)로 추가(getSuppressed()로 확인)

4. 예제 코드

전통적 finally 방식

BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("data.txt"));
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try { br.close(); }
        catch (IOException ex) { ex.printStackTrace(); }
    }
}

try-with-resources 방식

try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    e.printStackTrace();
}
// br.close()가 자동 호출