2023. 1. 25. 15:25ใJAVA/Effective JAVA
item09. try-finally๋ณด๋ค try-with-resources ๋ฅผ ์ฌ์ฉํ๋ผ.
" p48. ์๋ฐ ํผ์ฆ๋ฌ ์์ธ ์ฒ๋ฆฌ ์ฝ๋์ ์ค์"
package chapter01.item09.puzzler;
import java.io.*;
/**
* item09. try-finally ๋ณด๋ค๋ try-with-resources๋ฅผ ์ฌ์ฉํ๋ผ.
* ์๋ฐ Puzzler ์ฑ
์ ์ธ๊ธํ ์์ธ ์ฒ๋ฆฌ ์ฝ๋์ ์ค์
*/
public class Copy {
private static final int BUFFER_SIZE = 8 * 1024;
static void copy(String src, String dst) throws IOException {
InputStream in = new FileInputStream(src);
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 {
try {
out.close();
} catch (IOException e) {
// ์์ ํ์ง ์๋๊ฐ? ์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ?
// No, ๋ค๋ฅธ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋๋๋ฒ๋ฆผ,,
}
try {
in.close();
} catch (IOException e) {
// ์์ ํ์ง ์๋๊ฐ? ์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ?
}
}
}
public static void main(String[] args) throws IOException {
String src = args[0];
String dst = args[1];
copy(src, dst);
}
}
์ดํํฐ๋ธ ์๋ฐ ์ฑ ์์ "์ฌ์ง์ด ๋ ์์ ๋ '์๋ฐ ํผ์ฆ๋ฌ' ์์ ์ค์๋ฅผ ์ ์ง๋ ใดใด๋ฐ, ์๋ ๊ฐ ์๋ฌด๋ ๋์น์ฑ์ง ๋ชปํ๋ค" ๋ผ๊ณ ์ธ๊ธํ ๋ถ๋ถ์ด ์๋ค.
๋ด์ฉ์ ๋์ถฉ ์์ ์ฝ๋์ ๋น์ทํ ๋ด์ฉ์ด๋ผ๊ณ ํ๋ค.
out.close ์ in.close์์ ๊ฐ๊ฐ try-catch๋ก ์ก์์ฃผ๋ฉด ์์ ํ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ฒ์ด๋ค. ๋ผ๊ณ ์๊ฐํ๋๋ฐ
์ฌ๊ธฐ์ ๋ณด๋ฉด IOException์ด ๋ฐ์ํ ๋๋ ๊ด์ฐฎ์ง๋ง out.close ํ ๋ RuntiimeException์ด ๋ฐ์ํด๋ฒ๋ฆฌ๋ฉด ์ ๊ธฐ์ ๋๋๋ฒ๋ ค In.close๋ฅผ ์ํํ์ง ๋ชปํ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋ try-with-resources ๊ฐ ์์ผ๋ ์ด์ try-finally๊ฐ ์๋ try-with-resources๋ฅผ ์ฌ์ฉํ์!!
" p49. try-with-resources ๋ฐ์ดํธ ์ฝ๋"
try-with-resources๋ ์ด๋ป๊ฒ ์์ธ ์ ๋ณด๋ ๋ชจ๋ ๋ณด์ฌ์ฃผ๊ณ , ์์ ํด์ ๋ ๋ค ์ฒ๋ฆฌํ ์ ์๋์ง ๊ถ๊ธํ๋ค๋ฉด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ๋๋ค.
๊ทผ๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ง์ ๋ณด๋ฉด์ ํ์ ํ๊ธฐ์๋ ํ๋๋๊น..ใ ใ IDE์ ํ์ ๋น๋ ค์ classes ํด๋ ์์ ์๋ ํ์ผ์ ๋ณด๋ฉด ๋๋ค.
public class TopLine {
// try-with-resources ์ด ์์์ ํ์ํ๋ ์ต์ ์ฑ
์ด๋ค.
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))){
return br.readLine();
}
}
public static void main(String[] args) throws IOException {
String path = args[0];
System.out.println(firstLineOfFile(path));
}
}
์ด ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package chapter01.item09.trywithresources;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TopLine {
public TopLine() {
}
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
String var2;
try {
var2 = br.readLine();
} catch (Throwable var5) {
try {
br.close();
} catch (Throwable var4) {
var5.addSuppressed(var4);
}
throw var5;
}
br.close();
return var2;
}
public static void main(String[] args) throws IOException {
String path = args[0];
System.out.println(firstLineOfFile(path));
}
}
try-finally๊ฐ ์๋ try-catch๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ ์์ธ ์ ๋ณด๋ฅผ ๋ค ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ addSuppressed ๋ก ์์ธ ๋ค์ ์ถ๊ฐํด์ฃผ๋ ํ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ br.close()๋ฅผ ๋๋ฒ ํธ์ถํ๋๋ฐ ๋ง์ง๋ง์ ํน์ ๋ชฐ๋ผ์ ํ๋ฒ ๋ ํธ์ถํ๋ฉด์ ์์ ํด์ ๋ฅผ ํด์ค๋ค. -> ์ด๋๊ฐ์ ์ํฉ์ ์ํด์ AutoCloseable์ด๋ ์ด๋ฅผ ๊ตฌํํ Closeable์ด idemponent ํด์ผ ํ๋๊ฒ ๊ฐ๋ค. ๋ช๋ฒ์ ํธ์ถํ๋๋ผ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋๊น!
๐ฅ try-finally๋ก ํ๋ ์์ ํด์ ๋ ์ด๋๊ฐ ํจ์ ์ด ์์ ํ๋ฅ ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ณด๋ค try-finally๋ฅผ ์ฌ์ฉํ ์ฝ๋๊ฐ ์๋ค๋ฉด
์ด์ try-with-resources๋ก ๋ณ๊ฒฝํด์ค์ผ๊ฒ ๋ค!!!!