JuBin's personal study blog

[Java] try-with-resources란? 본문

JAVA

[Java] try-with-resources란?

JuBin 2024. 4. 28. 17:29
반응형

기존 try-catch-finally

try-catch-resources 이전의 try-catch-finally에서는 자원을 사용 후 finally 구문에 명시적으로 close() 메소드를 호출하여 사용한 자원을 해제 시켜줘야 했습니다.

    FileInputStream is = null;
    BufferedInputStream bis = null;
    try {
        is = new FileInputStream("test.txt");
        bis = new BufferedInputStream(is);
        int data = -1;
        
        while((data = bis.read()) != -1){
            // logic
        }
    } finally {
        // 명시적으로 사용한 자원을 relase해줌
        if (is != null) is.close();
        if (bis != null) bis.close();
    }

 

문제

  • 일일히 close() 메소드를 통하여 자원을 해제해야 해서 번거로움
  • 실수로 자원을 반납하는 코드가 누락된 경우 메모리 누수 발생 위험

 

Java7부터 도입된 try-with-resources

위와 같은 문제점들 때문에 사용한 자원을 자동으로 반납해주는 try-with-resourcces 구문이 추가 되었습니다.

try-with-resources 구문에서는 AutoCloseable Interface를 구현하고 있는 자원에 대해만 적용 가능하고, 이를 통해 명시적으로 자원을 해제시켜주는 코드가 필요가 없어지게 되고, 메모리 누수 위험이 줄게 되었습니다.

try (InputStream is = commentFilePath.equals(DEFAULT_COMMENT_FILE) ?
                getClass().getResourceAsStream(commentFilePath) : new FileInputStream(commentFilePath);
             BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
// logic
}

 

 

AutoCloseable Interface

AutoCloseable 인터페이스는 기존에 Closeable 인터페이스의 부모로 올라가 Closeable이 AutoCloseable을 상속하도록 구현해 놓았습니다. 이유는 만약 Inputstream(Closeable 인터페이스 구현체)같은 기존 구현체들이 새로 만들어진 AutoCloseable을 구현하도록 코드 변경 없이 하위 호환성을 위하여 만들어 졌다고 합니다.

public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

public interface AutoCloseable {
    void close() throws Exception;
}
반응형