[Effective Java] Item 9 - try-finally보다는 try-with-resources를 사용하라

@seonjuleee · June 01, 2022 · 2 min read

try-finally

닫아야 하는 자원을 자용할 경우 회수할 때 try-finally를 전통적으로 사용하곤 했다.

static String firstLineOfFile(String path, String defaultVal) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    // try-finally 방식 사용
    try {
        return br.readLine();
    } finally {
        br.close();
    }
}

하지만 이 방식이라면, 자원이 둘 이상일 경우에 지저분해진다는 단점이 있다. 또, 예외 사항이 무시되어 디버깅을 어렵게 하기도 한다.

static void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src);
    // InputStream에 대한 try-finally 문
    try {
        OutputStream out = new FileOutputStream(dst);
        // OutputStream에 대한 try-finally 문
        try {
            byte[] buf = new byte[BUFFER_SIZE];
            int n;
            while ((n = in.read(buf)) >= 0)
                out.write(buf, 0, n);
        } finally {
            out.close();
        }
    } finally {
        in.close();
    }
}

try-with-resources

앞서 설명한 문제들은 try-with-resources로 쉽게 해결이 가능하다. 이 구조를 사용하기 위해서는 자원이 AutoCloseable 인터페이스를 구현하면 된다.

static String firstLineOfFile(String path, String defaultVal) throws IOException {
    // try-with-resouces 방식 사용
    try (BufferedReader br = new BufferedReader(
            new FileReader(path)
    )) {
        return br.readLine();
    } catch (IOException e) {
        return defaultVal;
    }
}
static void copy(String src, String dst) throws IOException {
    
    try (
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);
    ) {
        byte[] buf = new byte[BUFFER_SIZE];
        int n;
        while ((n = in.read(buf)) >= 0)
            out.write(buf, 0, n);
    }
}

참고

@seonjuleee
Hello :) I'm Seonju Lee.