Item 9. try-with-resources

try-finally๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” InputStream, OutputStream, java.sql.Connection๊ณผ ๊ฐ™์ด close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ง์ ‘ ์ž์›์„ ํšŒ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ์ž์›์ด ๋งŽ๋‹ค. ์ž์›์„ ํšŒ์ˆ˜ํ•˜๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋†“์น˜๊ธฐ ์‰ฌ์šด ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋Œ€์ฒด๋กœ ์ž์›์„ ํšŒ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด์„  try-finally ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

try-finally ์‚ฌ์šฉ

class Test {

    // ํ•˜๋‚˜์˜ ์ž์›์„ ํšŒ์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ
    static String firstLineOfFile(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        try {
            return br.readLine();
        } finally {
            br.close(); // ์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋งŒ stack trace์— ๋‚จ์Œ
        }
    }
}

์œ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด try-finally ๋ฌธ๋ฒ•์€ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ try-finally ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, finally ๋ธ”๋ก ์•ˆ์— close() ๋ฉ”์„œ๋“œ์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•„๋ž˜์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰์ด ๋œ๋‹ค.

  1. br.readLine()์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ(try ๋ธ”๋ก)

  2. finally ๋ธ”๋ก์œผ๋กœ ์ด๋™

  3. br.close()์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ(finally ๋ธ”๋ก)

  4. br.close()์˜ ์˜ˆ์™ธ๊ฐ€ br.readLine()์˜ ์˜ˆ์™ธ๋ฅผ ๋ฎ์–ด์”€

  5. ๊ฒฐ๊ณผ์ ์œผ๋กœ stack trace์—๋Š” br.close()์˜ ์˜ˆ์™ธ๋งŒ ๋‚จ์Œ

try-with-resources ์‚ฌ์šฉ

์œ„ ๋ฌธ์ œ๋Š” Java 7์— ๋‚˜์˜จ try-with-resources ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์‚ฌ์šฉํ•˜๋Š” ์ž์›(ํด๋ž˜์Šค)์ด AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค

BufferedReader๋Š” AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋†“์€ ํด๋ž˜์Šค์ด๋ฉฐ, ๋งŽ์€ ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋†“์•˜๋‹ค. AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค์—์„œ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž์›์„ ํšŒ์ˆ˜ํ•œ๋‹ค.

BufferedReader Diagram
public interface AutoCloseable {
    /**
     * Closes this resource, relinquishing any underlying resources.
     * -> ์ด ์ž์›์„ ํšŒ์ˆ˜ํ•˜๊ณ , ๊ด€๋ จ๋œ ํ•˜์œ„ ์ž์›๋“ค๋„ ํšŒ์ˆ˜ํ•œ๋‹ค.
     * This method is invoked automatically on objects managed by the
     * {@code try}-with-resources statement.
     * -> ์ด ๋ฉ”์„œ๋“œ๋Š” try-with-resources ๋ฌธ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด์—์„œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
     *
     * ...
     */
    void close() throws Exception;
}

try-with-resources ๊ตฌ๋ฌธ

๊ธฐ์กด ์ฝ”๋“œ์— try-with-resources ๊ตฌ๋ฌธ์„ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class Test {

    static String firsLineOfFile(String path) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine();
        } catch (IOException e) {
            throw e;
        } finally {
            System.out.println("finally");
        }
    }
}
  • ์ •์ƒ ์‹คํ–‰

  1. try ๋ธ”๋ก ์•ˆ์—์„œ BufferedReader ๊ฐ์ฒด ์ƒ์„ฑ

  2. try ๋ธ”๋ก ์•ˆ์—์„œ BufferedReader ๊ฐ์ฒด์˜ readLine() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

  3. finally ๋ธ”๋ก ์ˆ˜ํ–‰

  4. finally ๋ธ”๋ก ์‹คํ–‰ ํ›„ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

  • ์˜ˆ์™ธ ๋ฐœ์ƒ

  1. try ๋ธ”๋ก ์•ˆ์—์„œ BufferedReader ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ

  2. try ๋ธ”๋ก ์•ˆ์—์„œ BufferedReader ๊ฐ์ฒด์˜ readLine() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ

  3. readLine() ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ

  4. catch ๋ธ”๋ก ์ง„์ž…ํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(์—†๋Š” ๊ฒฝ์šฐ ์ƒ์œ„ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์ „ํŒŒ)

  5. finally ๋ธ”๋ก ์ˆ˜ํ–‰

  6. finally ๋ธ”๋ก ์‹คํ–‰ ํ›„ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ close() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ

  7. close() ๋ฉ”์„œ๋“œ์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ ์‹œ ์ด ์˜ˆ์™ธ๋Š” ๋ณ„๋„ ์ฒ˜๋ฆฌ ๋จ

๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ realLine์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ close() ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค. close()์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— stack trace์—๋Š” readLine()์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋งŒ ๋‚จ๊ฒŒ ๋˜๊ณ , close()์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋„ getSuppressed() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Last updated

Was this helpful?