item 9 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
์์ ๋ซ๊ธฐ์ ์ค์์ฑ
InputStream, OutputStream, java.sql.Connection ๋ฑ์ close ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ง์ ๋ซ์์ค์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ๊น๋นกํ๊ณ ์์์ ๋ซ์ง ์์ผ๋ฉด ์์ธกํ ์ ์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์๋ค.
์ด ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด finalizer๋ฅผ ํ์ฉํ ์๋ ์์ง๋ง ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค. (item 8)
์ผ๋ฐ์ ์ผ๋ก ์์์ ๋ซ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
์ ํต์ ์ธ ๋ฐฉ๋ฒ์ธ try-fianlly์ java 7 ์ดํ ์ฌ์ฉํ ์ ์๋ try-with-resources์ด๋ค.
์์์ ๋ซ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ :: 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();
}
}
๋๋ฌด ๋ณด๊ธฐ๊ฐ ํ๋ค๋ค.
try-finally์ 2๊ฐ์ง ๋จ์ ์ด ์๋ค.
์ฒซ ๋ฒ์งธ ๋จ์ ์ ๊ฐ๋ ์ฑ์ด ์์ข๋ค๋ ๊ฒ์ด๋ค.
๋ ๋ฒ์งธ ๋จ์ ์ ์คํ ์ถ์ ์ด ์ด๋ ค์ธ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์์ firstLineOfFile ๋ฉ์๋๋ฅผ ํตํด ์ข ๋ ์์ธํ ์ดํด๋ณด์.
์์ธ๋ try ๋ธ๋ก๊ณผ finally ๋ธ๋ก ๋ชจ๋์์ ๋ฐ์ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ธฐ๊ธฐ์ ๋ฌผ๋ฆฌ์ ์ธ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด firstLineOfFile ๋ฉ์๋ ๋ด์
readLine ๋ฉ์๋๊ฐ ์์ธ๋ฅผ ๋์ง๊ณ , ๊ฐ์ ์ด์ ๋ก close ๋ฉ์๋๋ ์คํจํ๋ค.
์์ธ๊ฐ ๋๊ฐ๊ฐ ์๊ฒจ๋ฒ๋ฆฌ๊ณ close ์์ธ๊ฐ readLine ์์ธ๋ฅผ ๋ฎ์ด๋ฒ๋ฆฐ๋ค.
์ค์ ๋ก ์คํ ์ถ์ ๋ด์ญ์ ์ฒซ ๋ฒ์งธ ์์ธ์ ๊ดํ ๋ด์ฉ์ ๋ฑ์ฅํ์ง ์๊ฒ ๋๊ณ ,
์ด๋ ์ค์ ์์คํ ์์์ ๋๋ฒ๊น ์ ๋ชน์ ์ด๋ ต๊ฒ ํ๋ค.
์๋ํ๋ฉด ์ฒซ ๋ฒ์งธ ์์ธ๋ถํฐ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ณดํต ์๋ฌ ํด๊ฒฐ์ ์์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ๋ฒ์งธ ์์ธ ๋์ ์ฒซ ๋ฒ์งธ ์์ธ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ ์๋ ์์ง๋ง ์ฝ๋๊ฐ ๋๋ฌด ์ง์ ๋ถํด์ง๋ค.
java 7์ ๋ฑ์ฅํ try-with-resources
try-finally์์์ ๋ฌธ์ ๋ค์ try-with-resources๊ฐ ๊น๋ํ๊ฒ ํด๊ฒฐํ๋ค.
try-with-resources๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํด๋น ์์์ด AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
์๋ํ๋ฉด close ๋ฉ์๋๋ฅผ ๋ฌด์กฐ๊ฑด ํธ์ถํ๊ธฐ ์ํด AutoCloseable๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
AutoCloseable ์ธํฐํ์ด์ค๋ close ๋ฉ์๋ ํ๋๋ง ์ ์๋์ด ์๋ค.
์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๋ง์ ํด๋์ค์ ์ธํฐํ์ด์ค๊ฐ ์ด๋ฏธ AutoCloseable์ ๊ตฌํํ๊ฑฐ๋ ํ์ฅํด๋๋ค.
๋ซ์์ผ ํ๋ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด AutoCloseable์ ๋ฐ๋์ ๊ตฌํํ์ฌ try-with-resources๋ฅผ ์ฌ์ฉํ์.
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
์ฐ์ ๊ต์ฅํ ๊น๋ํ๋ค
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);
}
}
2๊ฐ ์ด์์ ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ต์ฅํ ๊น๋ํ๋ค.
๋ํ try-finally๋ณด๋ค ๋ฌธ์ ๋ฅผ ์ง๋จํ๊ธฐ๋ ํจ์ฌ ํธํ๋ค.
firstLineOfFile ๋ฉ์๋๋ฅผ ๋ณด์.
readLine๊ณผ ์ฝ๋์๋ ๋ณด์ด์ง ์๋ close ๋ชจ๋์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด
์คํ ์ถ์ ๋ด์ญ์ readLine์์ ๋ฐ์ํ ์์ธ๊ฐ ๋จผ์ ํ์๋๋ค.
๊ทธ๋ฆฌ๊ณ close์์ ๋ฐ์ํ ์์ธ๋ ์จ๊ฒจ์ก๋ค๋ ๊ผฌ๋ฆฌํ์ธ suppressed๋ฅผ ๋ฌ๊ณ ๊ทธ ์ดํ์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
try-finally์ ๋ฌ๋ฆฌ ์ฒซ ๋ฒ์งธ ์์ธ๋ถํฐ ํ์ธํ ์ ์๋ ๊ฒ์ด๋ค.
๋ํ ์๋์ฒ๋ผ java 7์์ Throwble์ ์ถ๊ฐ๋ getSuppressed ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ํ๋ก๊ทธ๋จ ์ฝ๋์์ ๊ฐ์ ธ์ฌ ์๋ ์๋ค.
try {
testException1();
} catch (Throwable e) {
Throwable[] suppExe = e.getSuppressed();
for (int i = 0; i < suppExe.length; i++) {
System.out.println("Suppressed Exceptions:");
System.out.println(suppExe[i]);
}
}
try-with-resources์์ catch ์ฌ์ฉํ๊ธฐ
try-finally์ฒ๋ผ try-with-resources์์๋ catch ์ ์ ์ธ ์ ์๋ค.
catch ์ ๋๋ถ์ try ๋ฌธ์ ๋ ์ค์ฒฉํ์ง ์๊ณ ๋ ๋ค์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
static String firstLineOfFile (String path, String defaultVal){
try (BufferedReader br = new BufferedReader(
new FileReader(path))) {
return br.readLine();
} catch (IOException e) {
return defaultVal;
}
}