본문 바로가기
TIL

[Java] 향상된 try catch문: try-with-resources

by 긍고 2024. 9. 21.
반응형

개요


최근 차세대 프로젝트에서 파일 입출력을 자주 다루게 되면서 자원 관리를 어떻게 최적화할지 고민하게 되었다. 기존의 try-catch-finally 구조를 사용해 자원을 닫는 코드를 작성했지만, 코드가 복잡해지고 실수할 가능성도 많았다. 코드 리뷰를 통해 자바 7에서 도입된 try-with-resources 문법을 알게 되었고, 자원 관리가 훨씬 간편해졌다. 이 글에서는 try-with-resources의 동작 방식과 이점에 대해 알아보고, 예제를 통해 쉽게 설명하려고 한다.

 

자바의 자원관리


자바에서 파일, 데이터베이스 연결, 네트워크 소켓과 같은 자원은 프로세스가 사용한 후 반드시 명시적으로 해제해야 한다. 그렇지 않으면 메모리 누수와 같은 심각한 문제를 초래할 수 있다. 전통적으로는 try-catch-finally 블록을 사용해 자원을 닫았지만, 실수로 자원을 해제하지 못하거나 예외가 발생하는 경우가 있어 코드가 불안정해질 수 있다.

 

try-with-resources란 무엇인가?


try-with-resources는 자바 7에서 도입된 구문으로, 자원을 명시적으로 닫는 코드를 작성하지 않고도 안전하게 자원을 관리할 수 있도록 돕는다. 이 구문을 사용하면 자원을 자동으로 해제해 주며, 코드가 더 간결하고 오류가 발생할 확률이 줄어든다. AutoCloseable 인터페이스를 구현한 자원은 모두 이 구문에서 사용할 수 있다.

 

try-with-resources의 동작 방식


try-with-resources 구문은 try 블록 안에서 자원을 선언하고, 자동으로 닫히도록 보장해 준다. 자원이 AutoCloseable 인터페이스를 구현하고 있으면, try 블록을 벗어날 때 자동으로 close() 메서드가 호출된다. 이는 예외가 발생하더라도 자원이 정상적으로 해제된다는 장점이 있다.

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

 

위 코드에서 BufferedReader는 AutoCloseable을 구현하고 있기 때문에, try-with-resources 구문에 포함되어 자동으로 자원이 해제된다.

 

예제 코드: try-with-resources 사용법


try-with-resources 구문은 다양한 자원에서 사용할 수 있다. 파일 입출력, 데이터베이스 연결, 네트워크 소켓 등에서 자주 사용된다. 아래는 데이터베이스 연결을 try-with-resources로 관리하는 예제다.

public class DatabaseConnectionExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, username, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
             
            while (rs.next()) {
                System.out.println("User: " + rs.getString("username"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

위 코드에서는 데이터베이스 연결, 명령 실행, 결과 집합을 모두 try-with-resources 구문을 통해 관리하고 있다. 각 자원이 자동으로 닫히며, 자원을 별도로 해제하는 코드를 작성할 필요가 없다.

 

정리


try-with-resources는 자바에서 자원 관리를 매우 간편하게 만들어 준다. 자원을 자동으로 해제할 수 있기 때문에 코드가 더 간결해지고, 예외 발생 여부와 관계없이 자원이 안전하게 관리된다. 이를 통해 메모리 누수와 같은 문제를 방지할 수 있으며, 특히 파일 입출력, 데이터베이스 연결, 네트워크 소켓 등 다양한 상황에서 유용하게 사용할 수 있다.

 

결론적으로, 자바 7 이상에서 자원 관리를 할 때는 try-with-resources 구문을 사용하는 것이 가장 안전하고 효율적인 방법이다. 앞으로 프로젝트에서 자원 관리가 필요한 경우, 이 구문을 적극적으로 활용해 보면 좋을것 같다.

댓글