STUDY/JAVA

[Effective Java] Item 09 try-finallyλ³΄λ‹€λŠ” try-with-resourcesλ₯Ό μ‚¬μš©ν•˜λΌ

ozllzL 2023. 9. 25. 23:59

 

썸넀일

https://www.yes24.com/Product/Goods/65551284

 

 

μ΄νŽ™ν‹°λΈŒ μžλ°” Effective Java 3/E - 예슀24

μžλ°” ν”Œλž«νΌ λͺ¨λ²” 사둀 μ™„λ²½ κ°€μ΄λ“œ - Java 7, 8, 9 λŒ€μ‘μžλ°” 6 μΆœμ‹œ 직후 μΆœκ°„λœ γ€Žμ΄νŽ™ν‹°λΈŒ μžλ°” 2νŒγ€ μ΄ν›„λ‘œ μžλ°”λŠ” μ»€λ‹€λž€ λ³€ν™”λ₯Ό κ²ͺμ—ˆλ‹€. κ·Έλž˜μ„œ μ‘ΈνŠΈμƒμ— λΉ›λ‚˜λŠ” 이 책도 μžλ°” 언어와 라이브

www.yes24.com

 

μžλ°” λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” close λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄ 직접 λ‹«μ•„μ€˜μ•Ό ν•˜λŠ” μžμ›μ΄ 많음

⇒ ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 연결이 μ œλŒ€λ‘œ μ’…λ£Œλ˜μ§€ μ•Šμ€ μ±„λ‘œ μœ μ§€λ˜μ–΄ μžμ› λˆ„μˆ˜κ°€ 계속 λ°œμƒν•  수 있음 → μ„±λŠ₯ μ €ν•˜, μžμ› λΆ€μ‘±

ex)

  • InputStream
  • OutputStream
  • java.sql.Connection

1. finalizerκ°€ λŒ€μ‹  ν•΄μ€€λ‹€κ³ λŠ” ν•˜μ§€λ§Œ 믿을 만 ν•˜μ§€ λͺ»ν•˜λ‹€.

  • ν˜ΈμΆœλ˜λŠ” μ‹œμ μ΄ μ˜ˆμΈ‘κ°€λŠ₯ν•˜μ§€ μ•ŠμŒ
  • μ‹€ν–‰λœλ‹€λŠ” 보μž₯ μ—†μŒ

2. μ›λž˜ 방법 try-finally

static String firstLineOfFile(String path) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        br.close();
    }
}

μ‚¬μš©ν•˜λŠ” μžμ›μ΄ ν•œ κ°œκ°€ μ•„λ‹Œ 경우 맀우 지저뢄함

static void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
        OutputStream out = new FileOutputStream(dst);
        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();
    }
}

이게 κ²°μ μ—†λŠ” μ½”λ“œμΈ 것도 μ•„λ‹˜

→ br.readLine();μ—μ„œ μ—λŸ¬ λ°œμƒν•˜κ³ , br.close(); μ—μ„œλ„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€λ©΄?

μ•ž μ—λŸ¬μ— κ΄€ν•œ μ •λ³΄λŠ” 남지 μ•Šκ²Œ λœλ‹€

 

3. try-with-resource

try 블둝 λ‚΄μ—μ„œ μžμ›μ„ μƒμ„±ν•˜κ³  ν•΄μ œν•˜μž

μ‚¬μš©μ΄ λλ‚œ μžμ›μ€ μžλ™μœΌλ‘œ ν•΄μ œλœλ‹€.

try (μžμ› μ΄ˆκΈ°ν™”) {
    // μžμ›μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œ
} catch (μ˜ˆμ™Έ νƒ€μž… λ³€μˆ˜) {
    // μ˜ˆμ™Έ 처리 μ½”λ“œ
}

AutoClosable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλŠ” μžμ› λŒ€μƒ :

close()κ°€ ν•„μš”ν•œ λŒ€λ‹€μˆ˜μ˜ μΈν„°νŽ˜μ΄μŠ€/ν΄λž˜μŠ€λŠ” 이미 AutoClosable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„/ν™•μž₯ ν•΄λ‘μ—ˆλ‹€.

- AutoClosable : 기쑴의 Closable을 extends함 - ν•˜μœ„ ν˜Έν™˜μ„± 100% 달성

 

μ•žμ˜ 문제 ν•΄κ²° : br.readLine();μ—μ„œ μ—λŸ¬ λ°œμƒν•˜κ³ , br.close(); μ—μ„œλ„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€λ©΄?

μ•ž μ—λŸ¬μ— κ΄€ν•œ μ •λ³΄λŠ” 남지 μ•Šκ²Œ λœλ‹€

→ close()λŠ” 숨겨져 μžˆμœΌλ―€λ‘œ readLine() μ—λŸ¬λ§Œ κΈ°λ‘λœλ‹€.

μˆ¨κ²¨μ§„ 것도 μ™„μ „νžˆ λ²„λ €μ§€λŠ” 것은 μ•„λ‹ˆλ©° Throwable의 getSuppressedλ₯Ό μ΄μš©ν•˜μ—¬ κ°€μ Έμ˜¬ 수 μžˆλ‹€.

static void copy(String src, String dst){
    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);
        }
    }
            catch (IOException e){
                throw e;
            }
}