본문 바로가기

Java 오류 & 개발/Java 기본 문법 & 오류

[Java] Java try-with-resources 문법과 자원 자동 해제

[Java] Java try-with-resources 문법과 자원 자동 해제

1. try-with-resources란?

try-with-resources는 Java 7부터 도입된 기능으로,

파일, 네트워크, 데이터베이스 연결 등 자원을 사용한 후 자동으로 해제하는 기능을 제공합니다.

기존에는 finally 블록을 사용해야 했지만,

이 문법을 활용하면 코드가 간결해지고 예외 처리도 더욱 안정적이 됩니다.

2. 기존의 try-finally 방식 (비효율적 방식)

기존에는 자원을 사용한 후 반드시 finally 블록에서 close()를 호출해야 했습니다.


import java.io.*;

public class TryFinallyExample {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("test.txt"));
            System.out.println(br.readLine());
        } catch (IOException e) {
            System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
        } finally {
            if (br != null) {
                try {
                    br.close(); // 자원 해제
                } catch (IOException e) {
                    System.out.println("파일 닫기 실패");
                }
            }
        }
    }
}

✅ 문제점:

- `finally` 블록에서 명시적으로 `close()` 호출해야 함

- `close()` 호출 중 예외가 발생하면 추가적인 예외 처리 필요

- 코드가 복잡해지고 가독성이 떨어짐

3. try-with-resources 방식 (자동 자원 해제)

try-with-resources를 사용하면 AutoCloseable 인터페이스를 구현한 객체는 자동으로 close()가 호출됩니다.


import java.io.*;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println(br.readLine()); // 파일 읽기
        } catch (IOException e) {
            System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
        }
    }
}

✅ 개선점:

- `finally` 블록 없이도 **자원이 자동으로 해제됨**

- 코드가 **깔끔하고 유지보수 용이**

- `close()` 호출 중 발생하는 예외 처리 불필요 

4. try-with-resources를 사용할 수 있는 클래스

아래와 같은 클래스는 AutoCloseable 인터페이스를 구현하고 있어, try-with-resources에서 사용할 수 있습니다.

클래스 설명
BufferedReader 파일을 읽을 때 사용
FileInputStream 파일을 바이트 단위로 읽을 때 사용
Connection (JDBC) 데이터베이스 연결을 위한 객체
Socket 네트워크 소켓 연결

---

5. try-with-resources에서 여러 개의 자원 사용

여러 개의 자원을 사용할 경우, try-with-resources에서 세미콜론(;)을 사용하여 선언하면 됩니다.


import java.io.*;

public class MultipleResourcesExample {
    public static void main(String[] args) {
        try (
            FileReader fr = new FileReader("test.txt");
            BufferedReader br = new BufferedReader(fr)
        ) {
            System.out.println(br.readLine()); // 파일 읽기
        } catch (IOException e) {
            System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
        }
    }
}

✅ 특징:

- 여러 개의 자원을 사용할 경우, 한 번에 자동으로 해제됨

- 예외 발생 시 **가장 마지막 자원부터 close() 호출**

📌 정리

  • ✔ **try-with-resources는 Java 7부터 도입된 기능으로, 자원을 자동으로 해제함**
  • ✔ **AutoCloseable 인터페이스를 구현한 클래스에서 사용 가능 (BufferedReader, FileInputStream, JDBC 등)**
  • ✔ **finally 블록 없이 자원을 해제할 수 있어 코드가 간결해지고 예외 처리가 쉬워짐**

🔗 다른 Java 예외 처리 관련 글도 함께 확인해보세요!

Java 예외(Exception) 처리 기초 및 try-catch 활용법