본문 바로가기
Language/Java

[JAVA] 코드의 격을 높이는 자원 관리의 혁신, try-with-resources 완벽 가이드

by Papa Martino V 2026. 1. 19.
728x90

try-with-resources
try-with-resources

 

자바 프로그래밍에서 파일 시스템, 데이터베이스 연결, 네트워크 소켓과 같은 외부 자원(Resource)을 다루는 일은 매우 빈번합니다. 하지만 이러한 자원들은 사용 후 반드시 close()를 통해 닫아주어야 한다는 치명적인 제약이 있습니다. 자원을 제대로 해제하지 않으면 메모리 누수(Memory Leak)와 시스템 성능 저하로 이어지기 때문입니다. 오늘은 자바 7에서 도입되어 현대 자바 코딩의 표준이 된 try-with-resources 문법이 무엇인지, 왜 기존의 finally 방식보다 우월한지, 그리고 실무에서 어떻게 활용해야 하는지 심도 있게 다뤄보겠습니다.

1. try-with-resources란 무엇인가?

try-with-resourcesjava.lang.AutoCloseable 인터페이스를 구현한 객체를 try 문에 선언하면, 블록이 종료될 때 자동으로 close() 메서드를 호출해 주는 자바의 문법적 설탕(Syntactic Sugar)입니다. 개발자가 명시적으로 finally 블록에서 자원을 닫을 필요가 없게 만들어 줍니다.

2. 왜 사용해야 하는가? (기존 방식과의 비교)

자바 7 이전에는 자원을 안전하게 닫기 위해 finally 블록 내에서 복잡한 null 체크와 중첩된 try-catch를 사용해야 했습니다. 이는 가독성을 해칠 뿐만 아니라 치명적인 예외 누락 문제를 야기하곤 했습니다.

2.1 가독성 및 코드 간결성

기존 방식은 자원이 늘어날수록 코드가 기하급수적으로 지저분해집니다. 반면 try-with-resources는 자원 선언과 로직을 명확히 분리하여 코드의 가독성을 획기적으로 높여줍니다.

2.2 예외 억제(Suppressed Exceptions) 메커니즘

기본 finally 방식에서는 try 블록에서 예외가 발생하고 finallyclose() 과정에서도 예외가 발생하면, try 블록의 예외가 무시되고 마지막 예외만 출력되는 문제가 있었습니다. try-with-resources는 모든 예외를 보존하며, 주 예외에 억제된 예외(Suppressed)를 첨부하여 디버깅을 훨씬 수월하게 만듭니다.

3. 기존 방식 vs try-with-resources 비교 요약

비교 항목 기존 try-catch-finally 현대적 try-with-resources
자동 종료 여부 개발자가 수동으로 작성 자동으로 수행
코드 길이 매우 길고 복잡함 매우 간결하고 직관적임
예외 처리 마지막 예외만 남을 위험 큼 모든 예외 정보 보존 (Suppressed)
필수 조건 없음 AutoCloseable 구현 필수

4. Sample Example: 실무 코드 비교

파일에서 한 줄을 읽어오는 간단한 예제를 통해 차이점을 직접 느껴보십시오.

[과거 방식] try-finally 사용


BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("data.txt"));
    System.out.println(br.readLine());
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close(); // 여기서 예외가 나면 위쪽 예외가 덮여버림
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

[현대적 방식] try-with-resources 사용


try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    e.printStackTrace();
} // 블록을 벗어나는 순간 br.close()가 자동으로 호출됨

5. 실무 적용 시 주의사항

  1. AutoCloseable 구현 확인: 자신이 직접 만든 자원 클래스를 이 구문에서 쓰려면 반드시 AutoCloseable 또는 Closeable 인터페이스를 구현해야 합니다.
  2. 자원 선언 순서: try(...) 안에 여러 자원을 선언할 수 있으며(세미콜론으로 구분), 자원은 선언된 역순으로 닫힙니다.
  3. 스코프(Scope) 유의: 선언된 자원 변수는 try 블록 내부에서만 유효합니다.

6. 결론: 클린 코드를 위한 필수 선택

try-with-resources는 단순한 편의 기능이 아니라, 자원 누수를 원천 차단하고 안정적인 디버깅 환경을 제공하는 자바의 필수 문법입니다. 아직 finally 블록에서 자원을 수동으로 닫고 있다면, 이제는 이 현대적인 방식을 도입하여 코드의 안정성과 품격을 높여야 할 때입니다.


참고 문헌 및 출처

  • Oracle Java Documentation: The try-with-resources Statement
  • Joshua Bloch, "Effective Java 3rd Edition", Item 9: Prefer try-with-resources to try-finally.
  • Java Platform, Standard Edition 21 API Specification - java.lang.AutoCloseable
728x90