Java

try-catch와 try-with-resources

변위니 2025. 1. 7. 16:16

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