DevLog ๐Ÿ˜ถ

[์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ”] ์•„์ดํ…œ 09. ๋ฆฌ์†Œ์Šค์˜ ์‚ฌ์šฉ๊ณผ ํ•ด์ œ : try-finally๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ ๋ณธ๋ฌธ

๐Ÿ“–/Effective Java

[์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ”] ์•„์ดํ…œ 09. ๋ฆฌ์†Œ์Šค์˜ ์‚ฌ์šฉ๊ณผ ํ•ด์ œ : try-finally๋ณด๋‹ค๋Š” try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

dolmeng2 2023. 3. 13. 15:14

๐Ÿ’ฌ ์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ” ์ฑ•ํ„ฐ 9๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.


โœ”๏ธ ๋ฆฌ์†Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ?

ํ”ํžˆ ์ž๋ฐ”์—์„œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ, catch๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , finally์—์„œ close()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ๋‹ซ์•„์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. (try-catch-finally) ์ด๋•Œ, ๋‹ซ์•„์ฃผ์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

์˜ค๋ผํด ๋ฌธ์„œ๋ฅผ ๋ฐœ์ทŒํ•ด๋ณด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์žฅ์ด ์กด์žฌํ•œ๋‹ค.

The typical Java application manipulates several types of resources such as files, streams, sockets, and database connections. Such resources must be handled with great care, because they acquire system resources for their operations. Thus, you need to ensure that they get freed even in case of errors.
...
This leads to application servers being frequently restarted when resource exhaustion occurs, because operating systems and server applications generally have an upper-bound limit for resources.

: ๋ฆฌ์†Œ์Šค ํš๋“ ์‹œ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํš๋“ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ฃผ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ•ด์ œํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ๋ณดํ†ต OS๋‚˜ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ƒํ•œ์น˜๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์†Œ์Šค ๊ณ ๊ฐˆ์ด ๋ฐœ์ƒํ•˜๋ฉด ์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ์žฌ์‹œ์ž‘๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

 

์ž๋ฐ”์—์„œ๋Š” ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1) ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค

- java.io ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, FileInputStream, FileOutputStream, BufferedReader ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ฝ๊ณ , ์“ฐ๊ธฐ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2) ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค

- java.net ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Socket ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค

- java.sql ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, DB์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฐ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

4) ์Šค๋ ˆ๋“œ ๋ฆฌ์†Œ์Šค

- java.lang.Thread ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค ํš๋“์„ ์œ„ํ•ด์„œ JVM์€ ์–ด๋–ค ์ผ๋“ค์„ ํ• ๊นŒ? ์šฐ์„ , ์ด๋ฅผ ์•Œ๊ธฐ ์ „์— ๊ฐ„๋‹จํ•˜๊ฒŒ OS ์ปค๋„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. 

์ปค๋„์€ ์šด์˜์ฒด์ œ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์œผ๋กœ, ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. (์œ„ํ‚คํ”ผ๋””์•„ ๋ฐœ์ทŒ) ์ด๋•Œ, ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋ฆฌ์†Œ์Šค์˜ ํ™œ์šฉ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. ์ปค๋„์€ ์ด๋Ÿฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก '์œ ์ € ๋ชจ๋“œ (User Mode)'์™€ '์ปค๋„ ๋ชจ๋“œ (Kernel Mode)'๋กœ ๋‚˜๋ˆ„์–ด, 2๊ฐ€์ง€์˜ ๋ชจ๋“œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

 

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ฃผ๋กœ ์œ ์ € ๋ชจ๋“œ์—์„œ, ๊ทธ๋ฆฌ๊ณ  ์ž์›์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋Š” ์ฃผ๋กœ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ์œ ์ € ๋ชจ๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„ ๋“ฑ์„ ์ง„ํ–‰ํ•˜๋ฉฐ, ์ปค๋„ ๋ชจ๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ, CPU ๊ฐ™์€ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹จ์ผ virtual address space๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด OS ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ ์ € ๋ชจ๋“œ์™€ ์ปค๋„ ๋ชจ๋“œ๋Š” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๐Ÿ’ฌ ์‹œ์Šคํ…œ ์ฝœ์ด๋ž€?

์šด์˜์ฒด์ œ ์ปค๋„์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜. ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋“œ์›จ์–ด์˜ ๋ฆฌ์†Œ์Šค๋‚˜ ์šด์˜ ์ฒด์ œ์˜ ์ž์›์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ, ํŠน๋ณ„ํ•œ ์š”์ฒญ์ด ํ•„์š”ํ•˜๋ฉด ์‹œ์Šคํ…œ ์ฝœ์„ ํ™œ์šฉํ•ด์„œ ์ปค๋„์— ์š”์ฒญ์„ ํ•˜๊ณ , ์ปค๋„์€ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์•„ ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ์„ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๊ฐ’์„ ์‹œ์Šคํ…œ ์ฝœ์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์ „ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ž๋ฐ”์—์„œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ณ  ์“ฐ๊ธฐ๋ฅผ ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ์ด๋‹ค.

 

1. ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ ๊ทธ์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•œ๋‹ค.

2. OS๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

3. ํ• ๋‹น๋ฐ›์€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด, JVM์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.

4. ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š”, ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฆฌ์†Œ์Šค๋Š” JVM ๋‚ด๋ถ€์—์„œ ์‚ญ์ œํ•œ ํ›„ OS์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ OS์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์†Œ์Šค์˜ ํ• ๋‹น๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ด์ œ๊นŒ์ง€ ์ค‘์š”ํ•˜๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฆฌ์†Œ์Šค์˜ ํ• ๋‹น๊ณผ ํ•ด์ œ ๊ณผ์ •์—์„œ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ, ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž. 

 


โœ”๏ธ try-finally๋กœ ๋ฆฌ์†Œ์Šค ํ• ๋‹น ๋ฐ ํ•ด์ œํ•˜๊ธฐ

์–ด๋Š ๋‚  ์ ธ๋‹ˆ๋Š”, ๋„ˆ๋ฌด๋„ˆ๋ฌด ์‹ฌ์‹ฌํ•œ ๋‚˜๋จธ์ง€ ๋ฐฑ์ค€์—์„œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ’€๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  BufferedReader๋ฅผ ํ™œ์šฉํ•˜์—ฌ InputStream์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
try {
    String str = buf.readLine();
    /**
     *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€์„ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
     */
} finally {
    buf.close();
}

 

์ด ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋งˆ์Œ์— ๋“ค์—ˆ๋˜ ์ ธ๋‹ˆ๋Š”, ๋„ˆ๋ฌด ๊ฐ๋ช…๋ฐ›์€ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ์“ฐ๋‹ค ๋ง๊ณ  ๋ฐฑ์ค€ ์”จ์—๊ฒŒ ํŽธ์ง€๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
try {
    String str = buf.readLine();
    /**
     *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€ ๊ณจ๋“œ๋ฅผ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
     */

    OutputStream out = new FileOutputStream(dest);
    try {
        String letter = "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์‚ฌ์‹ค ๋ฐฑ์ค€์„ ๋„ˆ๋ฌด ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™œ ํ’€์–ด์•ผ ํ•˜๋‚˜์š”...?";
        byte[] bytes = letter.getBytes();
        out.write(bytes);
    } finally {
        out.close();
    }
} finally {
    buf.close();
}

๊ทธ๋Ÿฌ๋‚˜, ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž์›์ด 2๊ฐœ ์ด์ƒ์ด ๋œ๋‹ค๋ฉด ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋”๋Ÿฌ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋งŒ์•ฝ ๋‚ด๋ถ€์˜ OutputStream์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  BufferedReader์—์„œ๋„ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, BufferedReader์˜ ์˜ˆ์™ธ๊ฐ€ ์•ž์„  ์˜ˆ์™ธ๋ฅผ ์ „๋ถ€ ์ง‘์–ด ์‚ผํ‚ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— OutputStream์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์˜ ์ •๋ณด๋Š” ๋‚จ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ’ฌ ์˜ˆ์™ธ ์ •๋ณด๊ฐ€ ๋‚จ์ง€ ์•Š๋Š”์ง€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ

๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ์™ธ ์ •๋ณด๊ฐ€ ์‹ค์ œ๋กœ ๋‚จ์ง€ ์•Š๋Š”์ง€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์ž.

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        try {
            String str = buf.readLine();
            /**
             *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€ ๊ณจ๋“œ๋ฅผ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
             */

            OutputStream out = new FileOutputStream(dest);
            try {
                String letter = "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์‚ฌ์‹ค ๋ฐฑ์ค€์„ ๋„ˆ๋ฌด ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™œ ํ’€์–ด์•ผ ํ•˜๋‚˜์š”...?";
                byte[] bytes = letter.getBytes();
                out.write(bytes);
                System.out.println("First!");
                throw new RuntimeException("Hello 1111");
            } finally {
                System.out.println("Second!");
                out.close();
            }
        } finally {
            buf.close();
            System.out.println("Third!");
            throw new RuntimeException("Hello 222");
        }
    }
}

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, RuntimeException์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „, ๋ฐœ์ƒํ•œ ํ›„, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ finally ๋•Œ ์ œ์–ด๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์™ธ throw (Hello 111)๋Š” ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ง‘์–ด ์‚ผ์ผœ์ ธ Hello 222๋งŒ ์‹คํ–‰๋œ๋‹ค.

 

์—ฌ๋Ÿฌ๋ชจ๋กœ try-finally๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์€ ๋ถˆํŽธํ•˜๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

 


โœ”๏ธ try-with-resources ํ™œ์šฉํ•˜๊ธฐ

try-with-resource๋Š” ์ž๋ฐ” 7์—์„œ ์ƒˆ๋กœ๋‚˜์˜จ ๊ตฌ์กฐ๋กœ, Autocloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

public interface AutoCloseable {
    void close() throws Exception;
}

AutoClosable์€ ๋‚ด๋ถ€์— close()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋งŒ ๋ฉ๊ทธ๋Ÿฌ๋‹ˆ ๋†“์—ฌ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Autocloseable์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, try ๊ตฌ๋ฌธ์ด ์ข…๋ฃŒ๋  ๋•Œ ๊ฐ์ฒด์˜ close() ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์ž์›์„ ํ•ด์ œํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์ด๋Š”, ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— finally ๋ธ”๋ก์— ์ž๋™์œผ๋กœ close() ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉฐ, ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์•„๊นŒ์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ Autocloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ทธ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์ˆ˜๋งŽ์€ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ AutoClosable์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

public interface Closeable extends AutoCloseable {
	...
}
public class BufferedReader extends Reader {
    public void close() throws IOException {
        synchronized (lock) {
            if (in == null)
                return;
            try {
                in.close();
            } finally {
                in = null;
                cb = null;
            }
        }
    }
}

// BufferedReader์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค.
public abstract class Reader implements Readable, Closeable {
    private static final int TRANSFER_BUFFER_SIZE = 8192;
		...
}

// OutputStream
public abstract class OutputStream implements Closeable, Flushable {
	...
}

BufferedReader๋Š” Reader๋ฅผ ์ƒ์†๋ฐ›๊ณ , Reader๋Š” Closeable์„ ์ƒ์†๋ฐ›์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด, ์ดˆ๊ธฐ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

[๋ฆฌ์†Œ์Šค๋ฅผ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ]

try (BufferedReader buf = new BufferedReader(new InputStreamReader(System.in))) {
        String str = buf.readLine();
        /**
         *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€์„ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
         */
        }

[๋ฆฌ์†Œ์Šค๋Š” 2๊ฐœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ]

try (BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
    OutputStream out = new FileOutputStream(dest)) {
    String str = buf.readLine();
    /**
     *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€ ๊ณจ๋“œ๋ฅผ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
     */
    String letter = "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์‚ฌ์‹ค ๋ฐฑ์ค€์„ ๋„ˆ๋ฌด ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™œ ํ’€์–ด์•ผ ํ•˜๋‚˜์š”...?";
    byte[] bytes = letter.getBytes();
    out.write(bytes);
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ์ œ๊ฑฐ๋˜๊ณ , try๋ฌธ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด์„œ ์„ ์–ธ์„ ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋งค์šฐ ๊น”๋”ํ•ด์ง„๋‹ค)

 

์—ฌ๊ธฐ์„œ, ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

// class version 55.0 (55)
// access flags 0x21
public class Main {

    // compiled from: Main.java

    // access flags 0x1
    public <init>()V
            L0
    LINENUMBER 5 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
            RETURN
    L1
    LOCALVARIABLE this LMain; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

    // access flags 0x9
    public static main([Ljava/lang/String;)V throws java/io/IOException
    TRYCATCHBLOCK L0 L1 L2 java/lang/Throwable
    TRYCATCHBLOCK L3 L4 L5 java/lang/Throwable
            L6
    LINENUMBER 7 L6
    NEW java/io/BufferedReader
            DUP
    NEW java/io/InputStreamReader
            DUP
    GETSTATIC java/lang/System.in : Ljava/io/InputStream;
    INVOKESPECIAL java/io/InputStreamReader.<init> (Ljava/io/InputStream;)V
    INVOKESPECIAL java/io/BufferedReader.<init> (Ljava/io/Reader;)V
    ASTORE 1
    L0
    LINENUMBER 8 L0
    ALOAD 1
    INVOKEVIRTUAL java/io/BufferedReader.readLine ()Ljava/lang/String;
    ASTORE 2
    L1
    LINENUMBER 9 L1
    ALOAD 1
    INVOKEVIRTUAL java/io/BufferedReader.close ()V
    GOTO L7
    L2
    LINENUMBER 7 L2
    FRAME FULL [[Ljava/lang/String; java/io/BufferedReader] [java/lang/Throwable]
    ASTORE 2
    L3
    ALOAD 1
    INVOKEVIRTUAL java/io/BufferedReader.close ()V
            L4
    GOTO L8
    L5
    FRAME FULL [[Ljava/lang/String; java/io/BufferedReader java/lang/Throwable] [java/lang/Throwable]
    ASTORE 3
    ALOAD 2
    ALOAD 3
    INVOKEVIRTUAL java/lang/Throwable.addSuppressed (Ljava/lang/Throwable;)V
            L8
    FRAME SAME
    ALOAD 2
    ATHROW
            L7
    LINENUMBER 10 L7
    FRAME CHOP 2
    RETURN
            L9
    LOCALVARIABLE buf Ljava/io/BufferedReader; L0 L7 1
    LOCALVARIABLE args [Ljava/lang/String; L6 L9 0
    MAXSTACK = 5
    MAXLOCALS = 4
}

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋Œ€์ถฉ ํ™•์ธํ•ด๋ณด์ž.

์œ„ ์ฝ”๋“œ๋Š” BufferedReader์™€ InputStreamReader์— ๋Œ€ํ•ด์„œ ํ• ๋‹นํ•˜๊ณ , ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๋ณ„๋„๋กœ close()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์ค€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (L1) ์ด๋•Œ, L1์—์„œ ์‚ฌ์šฉ๋˜๋Š” close()๋Š” BufferedReader๊ฐ€ ์ƒ์†๋ฐ›์€ Reader ๊ฐ์ฒด๋ฅผ ๋‹ซ์•„์ฃผ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ด๋•Œ, Reader์˜ close()๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ ๊ตฌํ˜„์ฒด์ธ BufferedReader์˜ close()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

L2์˜ ๊ฒฝ์šฐ L0์™€ L1 ์‚ฌ์ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ catchํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, try-catch ๋ธ”๋ก์˜ ์‹œ์ž‘์ ์œผ๋กœ, ๋ชจ๋“  ์˜ˆ์™ธ์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Throwable์„ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. 

L3๋Š” BufferedReader ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋‹ซ์œผ๋ฉฐ (๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ์•„์„œ ์ถ”๊ฐ€๋œ ์ฝ”๋“œ์ด๋‹ค), L4์—์„œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ›„ L8์œผ๋กœ ์ ํ”„ํ•˜๊ฒŒ ๋œ๋‹ค. 

(L8์—์„œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„, ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•ด์„œ athrow๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ๋ฅผ ๋‹ค์‹œ ๋ฐœ์ƒ์‹œ์ผœ ๋‹ค์Œ์œผ๋กœ ์ „ํŒŒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ์ง„ํ–‰ํ•œ๋‹ค.)

L5์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ •๋ณด์— ๋Œ€ํ•ด์„œ ์ €์žฅํ•˜๊ณ  addSuppressed() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. ์ž์›์„ ํ•ด์ œํ•˜๋Š” ๋„์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ์˜ˆ์™ธ๋Š” addSuppressed()๋ฅผ ํ†ตํ•ด ๋ณ„๋„๋กœ ์ €์žฅํ•ด๋‘์–ด ํ•ด๋‹น ์˜ˆ์™ธ์˜ ์ƒ์œ„๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

๐Ÿ’ฌ suppressed ์˜ˆ์™ธ

try-with-resources์—์„œ ์ž์›์„ ๋‹ซ๋Š” ๋„์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, try ๋ธ”๋ก์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์•ž์— ์ถ”๊ฐ€๋˜์–ด ๊ธฐ๋ก๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ suppressed ์˜ˆ์™ธ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ์˜ˆ์™ธ์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์— ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ , getSuppressed() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. try ๋ธ”๋ก์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์™€ ํ•จ๊ป˜ catch์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฝ”๋“œ๋กœ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

class CustomResource implements AutoCloseable {
    public void open() throws IOException {
        System.out.println("Resource opened!");
    }

    public void close() throws IOException {
        System.out.println("close() Call!");
        throw new IOException("close() Exception!!");
    }
}

public class Main {
    public static void main(String[] args) {
        try (CustomResource customResource = new CustomResource()) {
            customResource.open();
            System.out.println("~ Run Logic ~");
            throw new RuntimeException("try() Exception!!");

        } catch (Exception e) {
            System.out.println(e.getMessage());
            Throwable[] suppressed = e.getSuppressed();
            for (Throwable throwable : suppressed) {
                System.out.println("Suppressed: " + throwable.getMessage());
            }
        } finally {
            System.out.println("~ finally ~");
        }
    }
}

์œ„ ์ฝ”๋“œ์˜ ๋กœ์ง์„ ๋ถ„์„ํ•ด๋ณด์ž.

1. try ๋ธ”๋ก์„ ์‹คํ–‰ํ•œ๋‹ค.

- ์ดˆ๊ธฐ์— open() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค, (Resource opened!)

- ์ดํ›„, ์–ด๋– ํ•œ ๋กœ์ง์ด ์‹คํ–‰๋œ๋‹ค. (Run Logic)

2. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

- ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , try ๋ธ”๋ก์ด ๋๋‚˜๋ฉด์„œ close() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

- addSuppressed๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.

๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ close()๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, catch๋ฅผ ํ†ตํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

 try (BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
             OutputStream out = new FileOutputStream("dest")) {
            String str = buf.readLine();
            /**
             *  ~ ๊ทธ์™ธ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ‹์ง„ ๋ฐฑ์ค€ ๊ณจ๋“œ๋ฅผ ์”น์–ด๋จน์„๋งŒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ ~
             */
            String letter = "์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์‚ฌ์‹ค ๋ฐฑ์ค€์„ ๋„ˆ๋ฌด ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™œ ํ’€์–ด์•ผ ํ•˜๋‚˜์š”...?";
            byte[] bytes = letter.getBytes();
            out.write(bytes);
        } catch (IOException e) {
            // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
        }
    }

๊ทธ๋ƒฅ ๊ธฐ์กด์ด๋ž‘ ๋˜‘๊ฐ™์ด catch๋ฌธ์„ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

 

+) ์ฐธ๊ณ ๋กœ, ์–ด์ฐจํ”ผ try-with-resources๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” close()์— ์˜ํ•ด์„œ IOException์€ ๋ฐ˜๋“œ์‹œ ๋˜์ง€๊ฑฐ๋‚˜, ํ˜น์€ ์žก์•„์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. (์ด๋Š” checked Exception์˜ ํŠน์ง•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•œ ๊ฒƒ์ด๋‹ค) 

์ด๋Š”, ์ž์›์„ ํ•ด์ œํ•˜๋Š” ๋„์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด๋ฉฐ, catch๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ throws๋กœ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (์œ„์—์„œ๋Š” ๊ทธ๋ƒฅ ์ „ํŒŒ์‹œ์ผœ์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ATHROW๋ฅผ ํ†ตํ•ด ์ „ํŒŒ์‹œ์ผฐ๋‹ค)

 

๐Ÿ’ก ์ฆ‰, try-with-resource๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ try ๋ธ”๋ก์„ ๋น ์ ธ๋‚˜๊ฐˆ ๋•Œ ์ž๋™์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•ด์ค€๋‹ค.
์ด๋•Œ, ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋„์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์˜ˆ์™ธ๋Š” ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๋’ค๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ปดํŒŒ์ผ๋Ÿฌ๋Š” finally ๊ตฌ๋ฌธ ๋‚ด๋กœ ์ž์›์„ ํ•ด์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— try์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ๋จผ์ € ์ „๋‹ฌ๋˜๊ณ , ๊ทธ ๋‹ค์Œ finally์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” addSuppressed ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ try ๋ธ”๋ก์— ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ์ถ”๊ฐ€๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์•„๋ž˜์˜ ์งˆ๋ฌธ๋“ค์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด์ž ๐Ÿค”

 

โœ”๏ธ try-with-resources๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฌด์—‡์ด ์ข‹์•˜๋Š”๊ฐ€?

- ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž์›์„ close()ํ•˜๋Š” ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (์ฝ”๋“œ๊ฐ€ ์งง์•„์ง€๋ฉด์„œ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.)

- ์ž๋™์œผ๋กœ ์ž์›์„ ํ•ด์ œํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์˜ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

โœ”๏ธ finally๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

- ์ž์›์„ ํ•ด์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

- ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์—ด๊ฒŒ ๋˜๋ฉด, ๊ฐ๊ฐ์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด close()๋ฅผ ์ฐจ๋ก€๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜์–ด ๊ฐ ๋ฆฌ์†Œ์Šค์˜ ํ•ด์ œ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด์ค€๋‹ค.

 

โœ”๏ธ GC๊ฐ€ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š”๋ฐ, try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

- ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์–ธ์ œ ํ•ด์ œ๋ ์ง€์— ๋Œ€ํ•ด์„œ ๋ณด์žฅํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์ž์›์„ ์‚ฌ์šฉํ•œ ๋’ค์— ๋น ๋ฅด๊ฒŒ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ด€์Šต์ด๋ฉฐ, try-with-resources๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ์ž์›์„ ํ•ด์ œํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค.

Comments