Java try-with-resources, 자원 해제, AutoCloseable, 예외 처리, Java 예외 안전성, try-catch-finally 대안
Java에서 파일, 네트워크, 데이터베이스와 같이 외부 자원을 사용할 때 정확한 자원 해제는 필수입니다. 과거에는 try-catch-finally 블록을 사용해 자원을 명시적으로 닫았지만, Java 7부터 도입된 **try-with-resources**는 이를 훨씬 더 우아하고 안전하게 처리할 수 있도록 해줍니다.
try-with-resources란?
try-with-resources는 자원을 자동으로 해제해주는 Java의 문법입니다. try 문에 자원을 선언하면, 해당 자원은 try 블록이 끝나면서 자동으로 닫힙니다. 이 문법을 사용하기 위해서는 자원이 AutoCloseable 인터페이스를 구현해야 합니다.
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
위 예제에서 BufferedReader는 AutoCloseable을 구현하고 있기 때문에, try 블록이 끝나면 자동으로 close()가 호출됩니다. finally 블록이 필요 없죠.
기존 try-catch-finally와의 차이점
전통적인 방식:
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("example.txt"));
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
try-with-resources:
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
// 작업 수행
} catch (IOException e) {
e.printStackTrace();
}
코드 간결성, 가독성, 그리고 예외 안전성 측면에서 압도적인 차이가 있습니다.
어떤 자원에 사용할 수 있나?
AutoCloseable 또는 Closeable을 구현한 클래스라면 모두 사용할 수 있습니다.
파일 | FileReader, BufferedReader, FileInputStream |
DB 연결 | Connection, Statement, ResultSet |
네트워크 | Socket, ServerSocket |
💡 팁: 커스텀 자원을 만들 때도 AutoCloseable을 구현하면 try-with-resources로 활용할 수 있습니다.
public class MyResource implements AutoCloseable {
@Override
public void close() {
System.out.println("MyResource closed");
}
}
실무에서 주의할 점
1. 복수 자원 처리: 여러 자원을 선언할 수 있으며, 선언 순서의 역순으로 해제됩니다.
try (
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
) {
// 처리
}
2. Exception이 여러 개 발생할 때: try 내부와 close()에서 예외가 동시에 발생할 수 있습니다. 이때는 Suppressed Exception으로 확인할 수 있습니다
for (Throwable t : e.getSuppressed()) {
t.printStackTrace();
}
3. 자원 재사용 불가: try 블록에 선언된 자원은 해당 블록 내에서만 유효합니다. 블록 외부에서 접근하려면 리팩토링이 필요합니다.
try-with-resources를 사용하지 않으면 어떤 문제가 생기나?
- 자원을 명시적으로 닫지 않으면 메모리 누수 발생
- 예외 상황에서 자원이 닫히지 않을 수 있음
- 코드가 복잡해지고 유지보수 어려움
결론: Java에서 자원 관리는 try-with-resources가 정답이다
try-with-resources는 단순히 코드를 줄이기 위한 문법이 아닙니다.
명시적인 자원 관리, 예외 안전성 보장, 그리고 가독성 개선을 동시에 충족하는 실무 필수 문법입니다.
이미지 예시 (추가 예정 시 아래 다이어그램 제안)
- try-catch-finally vs try-with-resources 흐름도
- AutoCloseable 인터페이스 구조도
'Backend > JAVA' 카테고리의 다른 글
Java의 강한 참조, 약한 참조, 부드러운 참조 완벽 정리 (0) | 2025.03.27 |
---|---|
[JAVA] List 출력 "System.out::println" (0) | 2022.05.20 |
[이클립스] 편집창 세로줄 없애는 방법 (0) | 2021.12.02 |
[JDBC] DB 연동 클래스 생성 (0) | 2021.11.22 |
[JAVA] 컬렉션 클래스 정리 & 요약 (0) | 2021.10.06 |