윤개발

[ITEM9] try-finally보다는 try-with-resources를 사용하라. 본문

책 내용 요약/Effective Java 3판

[ITEM9] try-finally보다는 try-with-resources를 사용하라.

DEV_SJ 2020. 4. 14. 13:32

자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다.
상당수가 안전망으로 finalizer를 이용하지만 믿을만 하지 못하다.(item8)

전통적으로 자원을 닫힘을 보장하는 수단으로서 아래와 같이 try-finally가 쓰였다.

try {
    OutputStream out = new FileOutputStream("filePath");
    // do something
} finally {
    out.close();
}

하지만 2개의 자원을 닫아야 하는 구간에서는 예외가 무시될 수 있으며 코드의 가독성도 떨어진다.

public void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
        OutputStream out = new FileOutputStream(dst);
        try {
            // do something
        } finally {
            out.close();
        }
    } finally {
        in.close();
    }
}

이러한 문제는 자바 7에서 등장한 try-with-resources구문을 사용하면 해결할 수 있다.
물론, AutoCloseable 인터페이스를 구현한 클래스에 대해서만 사용이 가능하며 여러 개의 자원도 한 번에 처리할 수 있다.

public void copy() throws IOException {
    try (InputStream in = new FileInputStream("filePath");
         OutputStream out = new FileOutputStream("filePath")) {
        // do something
    }
}

정리

꼭 회수해야 하는 자원은 try-with-resources 문장을 사용하자. 코드는 더 짧고 분명해진다.

Comments