[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 오류 & 개발 > Java 기본 문법 & 오류' 카테고리의 다른 글
[Java] 멀티스레드(Thread) 기초와 동기화(Synchronization) (1) | 2025.03.24 |
---|---|
[Java 기본 문법 & 오류] Java 인터페이스(Interface)와 추상 클래스(Abstract Class) 비교 (0) | 2025.03.17 |
[Java] Java의 메모리 관리: Stack vs Heap 개념과 차이점 (1) | 2025.03.14 |
[Java 기본 문법 & 오류] Java ArrayList와 LinkedList 차이 및 활용법 (0) | 2025.03.14 |
[Java 기본 문법 & 오류] Java Optional 사용법 및 활용 사례 (1) | 2025.03.14 |