try-catch-finally
try-catch-finally 문은 자바7 이전에 나온 예외 처리 구문으로 모든 객체를 포함할 수 있다.
사횽 후 반납을 해주어야 하는 자원은 Closeable 인터페이스를 구현하는데, 사용 후 close 메서드를 직접 호출하여 반납해야 한다.
자원 반납이 이루어지지 않는 경우, 메모리 누수가 발생할 수 있고 다른 프로세스, 스레드에 영향을 줄 수 있다.
따라서 finally 블록 내에서 자원 해제를 꼭!! 해주어야 한다.
try {
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
// 생략
} catch (IOException e) {
System.err.println("IOException: " + e.getMessage());
} finally {
try {
if (br != null) {
br.close(); // BufferedReader 닫기
}
} catch (IOException e) {
System.err.println("Error closing BufferedReader: " + e.getMessage());
}
}
자원을 반납하는 코드가 필요하고, 실수나 에러로 자원을 반납하지 못하는 경우가 생길 수 있다.
이 문제를 해결하기 위해 Java7부터 자원을 자동으로 반납해주는 try-with-resources 문법이 도입되었다.
try-with-resources
Java7 부터 도입된 자원 관리를 위한 구문으로, AutoClosable 인터페이스를 구현한 자원을 사용 후 자동으로 반납해준다.
이를 통해 예외 발생 시 자원이 안전하게 해제될 수 있다.
try (/*자원 초기화*/) {
// 자원을 사용하는 코드
} catch (예외 타입 변수) {
// 예외 처리 코드
}
AutoCloseable 인터페이스를 구현한 객체만 try 블록 내에서 리소스로 사용할 수 있다.
주로 파일, 소켓, 데이터베이스 연결 등에 사용됩니다.
try (Connection conn = JdbcManager.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 코드 생략
} catch (SQLException e) {
e.printStackTrace();
}
Connection.java
public interface Connection extends Wrapper, AutoCloseable {
// 생략
}
Closeable과 AutoCloseable
public interface Closeable extends AutoCloseable {
void close() throws IOException;
}
기존의 Closeable에 부모 인터페이스 AutoCloseable 를 확장한 모습이다.
Closeable이 AutoCloseable을 확장했기 때문에, Closeable을 구현한 클래스는 AutoCloseable이 제공하는 close() 메서드를 포함한다. 따라서, Closeable을 구현한 모든 클래스는 try-with-resources를 사용하여 자원 해제를 자동으로 처리할 수 있다.
try-catch 문에서는 예외가 발생할 수 있는 모든 코드가 포함될 수 있으며, 특정 객체 타입에 제한되지 않는다.
try-with-resources 문에서는 AutoCloseable 를 구현한 객체만을 사용할 수 있고, 자원 관리에 유용하다.
'Java' 카테고리의 다른 글
HashMap의 구조 (0) | 2025.01.07 |
---|---|
Statement와 PreparedStatement (0) | 2025.01.07 |
static (0) | 2025.01.07 |
ArrayList와 LinkedList (0) | 2025.01.07 |
상속과 다형성 (0) | 2025.01.07 |