Try-with-resources๋ฅผ ์ด์šฉํ•œ ์ž์›ํ•ด์ œ ์ฒ˜๋ฆฌ

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ integer.blog



์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๋˜ ์ค‘ Try-with-resources๋ฅผ ์•Œ๊ฒŒ ๋˜์–ด ์ •๋ฆฌ

์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ธฐ ์ „ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

public static String getHtml(String url) {

    try{
        URL targetUrl = new URL(url);
        BufferedReader reader = new BufferedReader(new InputStreamReader(targetUrl.openStream()));
        StringBuffer html = new StringBuffer();
        String tmp = "";

        while ((tmp = reader.readLine()) != null) {
            html.append(tmp);
        }
        reader.close(); // ์ด ๋ถ€๋ถ„ ์ „์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด BufferedReader๋ฅผ ๋‹ซ์ง€ ๋ชปํ•˜๊ณ  catch๋ฌธ์œผ๋กœ ๋น ์ง€๋Š” ๋ฌธ์ œ
        return html.toString();

    } catch (MalformedURLException e) {
        reader.close(); // ์ดˆ๊ธฐ์—๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋˜ ์ฝ”๋“œ
        e.printStackTrace();
        throw e;
    } catch (IOException e) {
        reader.close(); // ์ดˆ๊ธฐ์—๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋˜ ์ฝ”๋“œ
        e.printStackTrace();
        throw e;
    } catch (Exception e) {
        reader.close(); // ์ดˆ๊ธฐ์—๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋˜ ์ฝ”๋“œ
        e.printStackTrace();
        throw e;
    }

ํ•œ๊ตญ๊ฑฐ๋ž˜์†Œ API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด url์„ ์ž…๋ ฅ๋ฐ›์•„ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ html์„ String์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
์ด ๋˜ฅ์ฝ”๋“œ๋Š” ๋ณด๊ธฐ๋งŒํ•ด๋„ ์ง€์ €๋ถ„ํ–ˆ๋Š”๋ฐ,
์ง€์ €๋ถ„ํ•œ ๊ฒƒ์€ ์ฐจ์น˜ํ•˜๊ณ , reader.close()์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜€๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด reader.close()๋ฅผ ๋ชจ๋“  catch๋ฌธ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜,
์•„๋ž˜์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด finally๋ฌธ์„ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

SomeResource resource = null;
try {
    resource = getResource();
    use(resource);
} catch(...) {
    ...
} finally {
    if (resource != null) {
        try { resource.close(); } catch(...) { /* ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ํ•จ */ }
    }
}

(์ถœ์ฒ˜: ์ตœ๋ฒ”๊ท ๋‹˜ ๋ธ”๋กœ๊ทธ)

ํ•˜์ง€๋งŒ ๋‚˜์˜ ๋˜ฅ์ฝ”๋“œ๋ฅผ ๋ณด์‹  ํŒ€์›๋ถ„๊ป˜์„œ JDK7 ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ try-with-resources๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์…จ๋‹ค.


๊ทธ๋ž˜์„œ Try-with-resources ๋Š” ๋ฌด์—‡?

Try-with-resources๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด
try์— ์ž์› ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, try ์ฝ”๋“œ ๋ธ”๋ก์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ž์›์„ ์ข…๋ฃŒํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ฆ‰, ๋”ฐ๋กœ finally ๋ธ”๋ก์ด๋‚˜ ๋ชจ๋“  catch ๋ธ”๋ก์— ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

try (SomeResource resource = getResource()) {
    use(resource);
} catch(...) {
    ...
}

๊ทธ๋Ÿฐ๋ฐ ์ด ๋•Œ, try์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์€ AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ ํ•œ์ •๋œ๋‹ค.

AutoCloseable์€ JDK1.7๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

/**
 * @author Josh Bloch
 * @since 1.7
 */
public interface AutoCloseable {
    void close() throws Exception;
}

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด try() ์•ˆ์— ๋ณต์ˆ˜์˜ ์ž์› ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

try(Something1 s1 = new Something1();
    Something2 s2 = new Something2()) {

} catch(...) {
    ...
}

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ๋Š” BufferedReader์™€ InputStreamReaderํด๋ž˜์Šค๊ฐ€ ์ถ”์ƒํด๋ž˜์Šค Reader๋ฅผ ์ƒ์†๋ฐ›์•˜๊ณ ,
Reader๋Š” Closeable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜์œผ๋ฉฐ,
Closeable ์ธํ„ฐํŽ˜์ด์Šค๋Š” AutoCloseable์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜๋‹ค.

๋•Œ๋ฌธ์— try-with-resources๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚ด๊ฐ€ ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

public static String getHtml(String url) throws IOException {

	URL targetUrl = new URL(url);

	try (BufferedReader reader = new BufferedReader(new InputStreamReader(targetUrl.openStream()))){
		StringBuffer html = new StringBuffer();
		String tmp;

		while ((tmp = reader.readLine()) != null) {
			html.append(tmp);
		}
		return html.toString();
	}
}

์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์œผ๋ฉฐ ๋ฐฐ์šด ๊ฒƒ์ด ๋งŽ์•„ ํ–‰๋ณตํ•œ ํ•˜๋ฃจ์˜€๋‹ค :)


Reference