[Effective Java] Item 09 try-finally보λ€λ try-with-resourcesλ₯Ό μ¬μ©νλΌ
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;
}
}