2023. 1. 25. 14:33ใJAVA/Effective JAVA
item09. try-finally ๋ณด๋ค๋ try-with-resources๋ฅผ ์ฌ์ฉํ๋ผ.
https://hyejin.tistory.com/1011
์ฌ๊ธฐ์ ๋ด์ฉ์ด ์ถ๊ฐ๋? ๋๋์ผ๋ก Item09. ์์๋ try-with-resources ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ค. (๊ถ์ฅ๋ณด๋ค๋ ์ฌ์ฉํ๋ผ๊ณ ํ๊ณ ์๋ค.)
์๋ฐ์์๋ close ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ง์ ๋ซ์์ค์ผํ๋ ์์์ด InputStream, OutputStream, Connection ๋ฑ์ด ์๋ค.
์์ ๋ซ๊ธฐ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋์น๊ธฐ ์ฌ์ด ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์์ธกํ ์ ์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง๊ธฐ๋ ํ๋ค..
์์ ์๋ ์์์ด ์ ๋๋ก ๋ซํ์ ๋ณด์ฅํ๋ ์๋จ์ผ๋ก try-finally๊ฐ ๋ง์ด ์ฐ์๋๋ฐ ์๋ฐ7์ด์๋ถํฐ๋ ๋์ด์ try-finally๊ฐ ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
public class TopLine {
// try-finally: ๋ ์ด์ ์์์ ํ์ํ๋ ์ต์ ์ ๋ฐฉ์ฑ
์ด ์๋๋ค!!
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
}finally {
br.close();
}
}
public static void main(String[] args) throws IOException {
String path = args[0];
System.out.println(firstLineOfFile(path));
}
}
์ด๋ ๊ฒ ์์ ์๋ ์์์ด ์ ๋๋ก ๋ซํ์ ๋ณด์ฅํ๋ ์๋จ์ผ๋ก ๋ง์ด ์ผ์๋๋ฐ ์ด ์ฝ๋๊ฐ ํ๋ ธ๋ค๋ ๊ฒ์ ์๋์ง๋ง
๋ง์ฝ์ ์์์ ํ๊ฐ๊ฐ ์๋ ๋๊ฐ ์ด์์ ์ฌ์ฉํ๋ค๋ฉด ?
package chapter01.item09.tryfinally;
import java.io.*;
/**
* item09. try-finally๋ณด๋ค try-with-resources๋ฅผ ์ฌ์ฉํ๋ผ.
*/
public class Copy {
private static final int BUFFER_SIZE = 8 * 1024;
// ์์์ด ๋ ์ด์์ด๋ฉด try-finally ๋ฐฉ์์ ์ฝ๋๊ฐ ๋๋ฌด ์ง์ ๋ถํด์ง๋ค.
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();
}
}
public static void main(String[] args) throws IOException {
String src = args[0];
String dst = args[1];
copy(src, dst);
}
}
-> ์์์ด ๋๊ฐ ์ด์์ด ๋๋๊น try-finally ๋ฐฉ์์ ์ฝ๋๊ฐ ๊ต์ฅํ ์ง์ ๋ถํด์ง๋ค.
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));
}
}
package chapter01.item09.trywithresources;
import java.io.*;
/**
* item09: try-finally ๋ณด๋ค๋ try-with-resources ๋ฅผ ์ฌ์ฉํ๋ผ.
*/
public class Copy {
private static final int BUFFER_SIZE = 8 * 1024;
// try-with-resources๋ ๋ณต์์ ์์์ ์ฒ๋ฆฌํ ๋ ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํ๋ค.
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);
}
}
}
public static void main(String[] args) throws IOException {
String src = args[0];
String dst = args[1];
copy(src, dst);
}
}
๊ทธ์ ๋นํด try-with-resources๋ฅผ ์ฌ์ฉํ๋ฉด try-finally์ ๋นํด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค๋ ์ฅ์ ์ธ์ ์์ธ ์ ๋ณด์ ๊ดํ ์ฅ์ ์ด ํ๋ ๋ ์๋ค.
public class BadBufferedReader extends BufferedReader {
public BadBufferedReader(Reader in, int sz) {
super(in, sz);
}
public BadBufferedReader(Reader in) {
super(in);
}
@Override
public String readLine() throws IOException {
throw new CharConversionException();
}
@Override
public void close() throws IOException {
throw new StreamCorruptedException();
}
}
์ฐ์ ์ด๋ ๊ฒ BufferedReader๋ฅผ ์์๋ฐ๊ณ , readLine ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด CharconversionException์ด ๋์ ธ์ง๊ณ , close ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด StreamCorruptedException์ด ๋์ ธ์ง๋ค๊ณ ํ๋ค.
public class TopLine {
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BadBufferedReader(new FileReader(path));
// try-finally๋ ๋งจ ๋ง์ง๋ง์ ๋ฐ์ํ ์์ธ๋ง ๋ณด์ธ๋ค๋ ๋จ์ ์ด ์๋ค.
// ์ฒซ๋ฒ์งธ ์์ธ๊ฐ ์ค์ํ๋ฐ ๋ค๋ฅธ ์์ธ๋ค์ ๋ณด์ด์ง ์๋ ๊ฒ์ด ๋จ์ ..!!
try {
return br.readLine();
}finally {
br.close();
}
}
public static void main(String[] args) throws IOException{
System.out.println(firstLineOfFile("book.obj"));
}
}
try-finally ๋ฅผ ์ฌ์ฉํ firstLineOfFile ๋ฉ์๋๋ฅผ ์คํํ๋ฉด
readLine ์์ ๋ฐ์ํ ์์ธ๋ ์์ ํ ์ผ์ผ์ง๊ณ close ์์ ๋ฐ์ํ ์์ธ๋ง ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค..
์ด๋ ๊ฒ ๋๋ฉด ์คํ ์ถ์ ๋ด์ญ์์ ์ฒซ๋ฒ์งธ ์์ธ์ ๊ดํ ์ ๋ณด๋ ํ๋๋ ๋จ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์ ์์คํ ์์ ๋๋ฒ๊น ์ ๊ต์ฅํ ์ด๋ ต๊ฒ ํ๋ค..!
๋ฌผ๋ก ๋๋ฒ์งธ ์์ธ์์ ์ฒซ๋ฒ์งธ ์์ธ๋ฅผ ๊ธฐ๋กํ๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ฃผ๋ฉด ๋๊ธฐ๋ ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ์๋ ์ฝ๋๊ฐ ๊ต์ฅํ ์ง์ ๋ถํด ์ง๊ณ , ์ด๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํ๋ค.
public class TopLineWithTryWithResources {
// try-with-resources ๋ ์์ธ๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ค๋ค.
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader bufferedReader = new BadBufferedReader(new FileReader(path))){
return bufferedReader.readLine();
}
}
public static void main(String[] args) throws IOException{
System.out.println(firstLineOfFile("book.obj"));
}
}
์ด๋ฒ์๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ try-with-resources ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๋๋ค.
๐ฅ ์ด์ item์์ ๋ดค์ง๋ง try-with-resources๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํด๋น ์์์ด AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ด์ผ ํ๋ค.
https://hyejin.tistory.com/1014
try-with-resources๋ฅผ ์ฌ์ฉํ๋ฉด readLine ๊ณผ close ์์ ๋ชจ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ฉด readLine ๋ฉ์๋์์ ๋ฐ์ํ ์์ธ๊ฐ ๊ธฐ๋ก๋๊ณ , close์์ ๋ฐ์ํ ์์ธ๋ ์จ๊ฒจ์ง๋๋ฐ ์ด๋ฐ ์จ๊ฒจ์ง ์์ธ๋ค์ด ๊ทธ๋ฅ ๋ฒ๋ ค์ง๋๊ฒ์ด ์๋๋ผ ์คํ ์ถ์ ๋ด์ญ์์ Suppressed ๋ผ๊ณ ํด์ ๊ผฌ๋ฆฌํ๋ฅผ ๋ฌ๊ณ ์ถ๋ ฅํด์ฃผ๊ธฐ ๋๋ฌธ์
์์ธ ์ ๋ณด๋ฅผ ๋ชจ๋ ํ์ธ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค!!!
๐ก ๊ผญ ํ์ํด์ผ ํ๋ ์์์ด ์์ ๋ ์ด์ ๋ try-finally ๋์ try-with-resources๋ฅผ ์ฌ์ฉํ์!!
try-finally์ ๋นํด ์ฝ๋๋ ๋ ์งง๊ณ ๋ถ๋ช ํ๋ฉฐ, ๋ง๋ค์ด์ง๋ ์์ธ ์ ๋ณด๋ ํจ์ฌ ํจ์ฌ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
'JAVA > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] Item10. equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ. (0) | 2023.01.26 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] Item09 ์๋ฒฝ๊ณต๋ต. (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต. AutoClosable (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต. Finalizer ๊ณต๊ฒฉ (0) | 2023.01.25 |
[์ดํํฐ๋ธ ์๋ฐ] Item08 ์๋ฒฝ๊ณต๋ต (0) | 2023.01.25 |