try with resource? 그게 뭔데...?

석현·2025년 3월 24일
0

Insight

목록 보기
31/43
post-thumbnail

개발자라면 누구나 한 번쯤 파일을 읽고, DB 연결을 하고, 자원을 다뤄본 경험이 있을 겁니다. 그럴 때마다 꼭 따라오는 이야기가 있죠.

"자원 해제를 잊지 말자!"

처음에는 try-catch-finally로 자원을 닫았고, 나중에는 try 블록 안에서 자동으로 자원을 닫아주는 try-with-resources를 알게 되었죠. 하지만 그냥 문법만 알고 넘어가는 걸로는 부족합니다. 왜 필요한지, 어떤 상황에서 쓰면 좋은지, 어떤 장점이 있는지 실무에서 제대로 느끼고 쓰는 게 더 중요합니다.

그래서 오늘은 자바 개발자라면 반드시 알아야 할 try-with-resources에 대해 정리해보려고 합니다.


🧐 try-with-resources란?

자바에서 try-with-resourcesAutoCloseable 인터페이스를 구현한 객체를 try 구문의 괄호 안에 선언하면, 블록이 종료될 때 자동으로 close() 메서드를 호출하는 기능입니다.

try (BufferedReader br = new BufferedReader(new FileReader("path"))) {
    return br.readLine();
} catch (IOException e) {
    e.printStackTrace();
}

위 코드에서 BufferedReaderAutoCloseable을 구현하고 있으므로, try 블록이 끝나면 자동으로 close()가 호출됩니다. 이게 없으면 직접 close()를 호출해야 하고, 예외가 발생하면 닫지 못하는 경우도 생길 수 있죠.


🆚 try-catch-finally vs. try-with-resources

기존의 try-catch-finally 방식과 비교해봅시다.

// 기존 방식
BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("path"));
    return br.readLine();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

문제점

  • finally에서 close()를 호출해야 함 → 코드가 길어짐
  • close()에서도 예외가 발생할 수 있어 예외 처리가 중첩됨
  • 실수로 자원 해제를 빼먹을 가능성

try-with-resources

try (BufferedReader br = new BufferedReader(new FileReader("path"))) {
    return br.readLine();
} catch (IOException e) {
    e.printStackTrace();
}

장점

  • 자원 해제가 자동으로 이루어짐
  • 코드가 간결하고 가독성이 좋아짐
  • 예외가 발생해도 안전하게 close()

깔끔하게 해결되죠? 😉


🔍 Suppressed Exception이란?

자원 해제 과정에서도 예외가 발생할 수 있습니다. 기존 방식에서는 이를 무시하거나 또 다른 try-catch로 감싸야 했죠.

하지만 try-with-resources는 메인 예외는 그대로 유지하면서, 자원 해제 중 발생한 예외는 Suppressed Exception으로 따로 기록합니다.

class CustomResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        throw new Exception("Close Exception 발생");
    }

    void process() throws Exception {
        throw new Exception("Primary Exception 발생");
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        try (CustomResource resource = new CustomResource()) {
            resource.process();
        }
    }
}

출력 결과:

Exception in thread "main" java.lang.Exception: Primary Exception 발생
    at CustomResource.process(CustomResource.java:9)
    at Main.main(Main.java:5)
Suppressed: java.lang.Exception: Close Exception 발생
    at CustomResource.close(CustomResource.java:5)
    at Main.main(Main.java:4)

이처럼 try-with-resources는 자원 해제 중 발생하는 예외도 놓치지 않고 기록합니다.


🎯 언제 사용하면 좋을까?

📌 파일 읽기/쓰기: BufferedReader, FileReader, FileWriter
📌 데이터베이스 연결: JDBC Connection, Statement, ResultSet
📌 네트워크 소켓: Socket, InputStream, OutputStream
📌 기타 자원 관리가 필요한 경우: Scanner, ZipFile

자바에서 자원을 다룰 일이 생긴다면, 거의 대부분 try-with-resources를 쓸 수 있습니다.


📋 비교 테이블: 기존 방식 vs. try-with-resources

항목기존 try-catch-finallytry-with-resources
코드 길이길고 복잡함짧고 깔끔함
예외 처리중첩 try-catch 필요Suppressed 예외 자동 처리
자동 해제수동 해제 필요자동 해제
가독성낮음높음

🧠 마무리

하드웨어가 좋아지고 메모리도 넉넉해진 지금, 자원 해제를 잊어버리는 경우가 많아졌습니다. 하지만 메모리는 곧 돈입니다. 적은 코드로 자원을 깔끔하게 관리하는 것은 개발자의 센스이자 실력이라고 생각합니다.

try-with-resources는 단순한 문법이 아닌, 안정성과 가독성을 모두 챙길 수 있는 무기입니다.

이 글을 통해 여러분의 코드도 더 안전하고, 더 우아해지길 바랍니다. 오늘도 좋은 코드 작성하세요! ✨

profile
Learner

0개의 댓글