Backend/Java

[๋ฒˆ์—ญ] Deprecated Features in Java 18 thru 21(Java 18 ~ 21 ๋ฒ„์ „์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ) - Sip of Java

Seyun(Marco) 2023. 12. 29. 12:38
728x90

๐Ÿ’ก ์›๋ณธ ๊ธ€ : https://inside.java/2023/12/17/sip093/

Java 18๊ณผ 21 ์‚ฌ์ด์—๋Š” ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ, ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์ค‘๋‹จ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ๊ฒ€ํ† ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Finalization

Java 18 ~ 21 ๊ธฐ๊ฐ„ ์‚ฌ์ด์— ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ํฐ ๊ธฐ๋Šฅ์€ finalization์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Java 18์˜ ์ผ๋ถ€ ๋ณ€ํ™”์˜€์œผ๋ฉฐ, JEP 421์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

removal of finalization์ด๋ž€?

Java์˜ removal of finalization์€ Java 11๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. finalize() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ž์›์„ ํ•ด์ œํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ finalize() ๋ฉ”์„œ๋“œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • finalize() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์—, finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณด์žฅ ํ•  ์ˆ˜ ์—†๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Java 11๋ถ€ํ„ฐ๋Š” finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๊ฐ์ฒด์˜ ์ž์›์„ ํ•ด์ œํ•˜๊ฑฐ๋‚˜, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, try-finally ๋ธ”๋ก์ด๋‚˜ close() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

try-finally ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด์˜ ์ž์›์„ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ finally ๋ธ”๋ก์— ์ž‘์„ฑํ•˜์—ฌ, ๊ฐ์ฒด๊ฐ€ ์ˆ˜๊ฑฐ๋˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

close() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด์˜ ์ž์›์„ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ close() ๋ฉ”์„œ๋“œ์— ์œ„์ž„ํ•˜์—ฌ, ๊ฐ์ฒด๊ฐ€ ์ˆ˜๊ฑฐ๋˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

removal of finalization์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • finalize() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • finalize() ๋ฉ”์„œ๋“œ์˜ ์‚ฌ์šฉ์„ ์ค„์—ฌ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

removal of finalization์˜ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Finalization์€ Java 1.0๋ถ€ํ„ฐ Java์˜ ๊ธฐ๋Šฅ์ด์—ˆ์ง€๋งŒ, ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์–‘ํ•˜๋ฉฐ, ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉด JEP๋ฅผ ๊ผญ ์ฝ์–ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. JEP์—๋Š” finalization์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ œ ๊ฒฐ๊ณผ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

finalization์ด ์‚ฌ๋ผ์ง„ ์ด์œ ?

 

finalize() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์ง€๋งŒ, ์—ฌ์ „ํžˆ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

finalize() ๋ฉ”์„œ๋“œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

finalize() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, Java ๊ฐœ๋ฐœ์ž๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค.

  • finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด sleep() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ finalize() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ ์„ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

  • sleep() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, finalize() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, finalize() ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

finalization์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ์ด์ž ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ finalization์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. --finalization=disabled์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JDK ์ž์ฒด์—์„œ ๋ชจ๋“  finalizer๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์•ฑ์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ์ž‘์—…์ด ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

jdk.FinalizerStatistics์˜ ์ผ๋ถ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ JRF(JDK Flight Recorder)์— ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด JFR์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:

$ java -XX:StartFlightRecording:filename=recording.jfr ...

jdk.FinancialStatistics์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”:

jfr print --events FinalizerStatistics recording.jfr

JRF์ด๋ž€?

Java 11๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. JRF๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์Šค๋ ˆ๋“œ ํ™œ๋™ ๋“ฑ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JRF๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ์Šค๋ ˆ๋“œ ํ™œ๋™ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JRF๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฝ˜์†”์—์„œ JFR ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ JFR์„ ์‹œ์ž‘ํ•˜๊ณ  ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— JFR์„ ํ†ตํ•ฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์ž๋™์œผ๋กœ JFR์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Š” ๋ณ€๊ฒฝ์— ํ•„์š”ํ•œ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋„ˆ์˜ ์ฝ”๋“œ์—์„œ finalize()๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ finalize()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ํด๋ž˜์Šค๋“ค์„ Closeable ๋˜๋Š” AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๊ณ , ๋ฆฌ์†Œ์Šค ํ•ด์ œ ๋™์ž‘์„ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ close() ๋ฉ”์„œ๋“œ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด try-with-resources ๋ธ”๋ก์ด ๋๋‚  ๋•Œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ฆ‰์‹œ ํ•ด์ œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try(MyCloseableResource res = new MyCloseableResource(){
    ...
}

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด JDK 9์— ์ถ”๊ฐ€๋œ Cleaner API๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. Rodger Riggs๋Š” Cleaner API ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Closeable๊ณผ AutoCloseable์ด๋ž€?

์œ„์—์„œ ์ด์•ผ๊ธฐ ํ•œ finalize() ๋ฉ”์„œ๋“œ์˜ ๋ฌธ์ œ์ ์œผ๋กœ ์ธํ•ด Java 7๋ถ€ํ„ฐ Closeable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š” close() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. close() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Java9 ๋ถ€ํ„ฐ๋Š” AutoCloseable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š” Closeable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค Closeable์„ ํ™•์žฅํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
์‚ฌ์šฉ try-with-resources ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try-with-resources ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ Closeable์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
public class MyClass implements Closeable {

    public void close() throws Exception {
        // ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    }

    public static void main(String[] args) throws Exception {
        MyClass myClass = new MyClass();

        try {
            // ...
        } finally {
            myClass.close();
        }
    }
}
๋‹ค์Œ์€ AutoCloseable์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
public class MyClass implements AutoCloseable {

    public void close() throws Exception {
        // ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    }

    public static void main(String[] args) throws Exception {
        try (MyClass myClass = new MyClass()) {
            // ...
        }
    }
}

 

Locales

JBS ์ด์Šˆ JDK-8282819์—์„œ JDK 19์—์„œ๋ถ€ํ„ฐ java.util.Locale์˜ ์ƒ์„ฑ์ž๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ๋Œ€์‹ ์— ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ง์ ‘์ ์œผ๋กœ ๋Œ€์ฒดํ•  ๋ฐฉ๋ฒ•์€ .of ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค:

  • Locale Locale.of(String)
  • Locale Locale.of(String, String)
  • Locale Locale.of(String, String, String)

forLanguageTag ๋ฉ”์„œ๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Locale Locale.forLanguageTag(String)

๊ทธ๋ฆฌ๊ณ  Locale.Builder๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Locale.of() ๋ฉ”์„œ๋“œ๋ž€?

Locale.of() ๋ฉ”์„œ๋“œ๋Š” Java์—์„œ ๋กœ์ผ€์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋กœ์ผ€์ผ์€ ๊ตญ๊ฐ€, ์–ธ์–ด, ์ง€์—ญ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.Locale.of() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Locale locale = Locale.of(language, country, variant);
  • language๋Š” ์–ธ์–ด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "en"์€ ์˜์–ด, "ko"๋Š” ํ•œ๊ตญ์–ด์ž…๋‹ˆ๋‹ค.
  • country๋Š” ๊ตญ๊ฐ€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "US"๋Š” ๋ฏธ๊ตญ, "KR"์€ ํ•œ๊ตญ์ž…๋‹ˆ๋‹ค.
  • variant๋Š” ์ง€์—ญ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "en-US"๋Š” ๋ฏธ๊ตญ ์˜์–ด, "ko-KR"์€ ํ•œ๊ตญ์–ด์ž…๋‹ˆ๋‹ค.

Locale.of() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • language ๋˜๋Š” country๊ฐ€ null์ธ ๊ฒฝ์šฐ
  • language ๋˜๋Š” country๊ฐ€ ์ž˜๋ชป๋œ ํ˜•์‹์ธ ๊ฒฝ์šฐ
Locale locale = Locale.of("ko", "KR");

System.out.println(locale); // ko_KR

Locale.forLanguageTag ๋ฉ”์„œ๋“œ๋ž€?

IETF BCP 47 ์–ธ์–ด ํƒœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Locale ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ์จ, BCP 47์€ ์–ธ์–ด, ์ง€์—ญ, ๋ณ€ํ˜• ๋“ฑ๊ณผ ๊ฐ™์€ ์–ธ์–ด ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐ๋„ท ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

Locale locale = Locale.forLanguageTag(languageTag);

๋งค๊ฐœ๋ณ€์ˆ˜:

  • languageTag: IETF BCP 47 ํ˜•์‹์˜ ์–ธ์–ด ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "en-US", "ko-KR", "zh-Hans-CN" ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
// ํ•œ๊ตญ์–ด ๋กœ์ผ€์ผ ์ƒ์„ฑ
Locale koLocale = Locale.forLanguageTag("ko-KR");

ํŠน์ง•:

  • ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ •๋ณด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ๋‹ˆ์ฝ”๋“œ CLDR(Common Locale Data Repository)์—์„œ ๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Java 7๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Locale.Builder๋ž€?

Locale ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์–ธ์–ด, ๊ตญ๊ฐ€, ๋ณ€ํ˜•๊ณผ ๊ฐ™์€ ๋กœ์ผ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์œ ์—ฐํ•˜๊ฒŒ ๋กœ์ผ€์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ง•:

  • ์ฒด์ด๋‹ ๋ฐฉ์‹: ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ์ผ€์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ: ์„ค์ •ํ•œ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜์—ฌ ์ž˜๋ชป๋œ ๋กœ์ผ€์ผ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • BCP 47 ํ˜ธํ™˜: ์ƒ์„ฑ๋œ ๋กœ์ผ€์ผ ๊ฐ์ฒด๋Š” IETF BCP 47 ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
Locale koLocale = new Locale.Builder().setLanguage("ko").setRegion("KR").setVariant("POSIX").build();

์žฅ์ :

  • ์ง๊ด€์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋กœ์ผ€์ผ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ผ€์ผ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ์ž˜๋ชป๋œ ๋กœ์ผ€์ผ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • BCP 47 ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ •๋ณด๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

COMPAT ๊ณต๊ธ‰์ž ์ œ๊ฑฐ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฐœ์ƒ(JDK-8304982)

JDK 9๋ฒ„์ „๋ถ€ํ„ฐ Java์˜ default Locale ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ COMPAT์—์„œ CLDR๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ JEP 262 ์ œ์•ˆ์„œ์—์„œ ๋‹ค๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. BS ์ด์Šˆ JDK-8304982์— ๋”ฐ๋ฅด๋ฉด, COMPAT ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. COMPAT๋Š” JDK 22๋ฒ„์ „๋ถ€ํ„ฐ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

COMPAT์™€ CLDR์ด๋ž€?

๋ชจ๋‘ Java์—์„œ ๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์œผOMPAT๋Š” Java 9 ์ด์ „ ๋ฒ„์ „์— ์‚ฌ์šฉ๋˜๋˜ Locale ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ. ๋ฐฉ์‹์ด๋ฉฐ, CLDR๋Š” Unicode Common Locale Data Repository์˜ ์•ฝ์ž๋กœ, ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ๋ฌธํ™”๊ถŒ์˜ Locale ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. Java 9๋ถ€ํ„ฐ ๊ธฐ๋ณธ Locale ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋Šฅ COMPAT CLDR
๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜ JDK CLDR
์ง€์›ํ•˜๋Š” ์–ธ์–ด ๋ฐ ๋ฌธํ™”๊ถŒ ์ œํ•œ์  ๊ด‘๋ฒ”์œ„
์ •ํ™•์„ฑ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์Œ
ํ˜ธํ™˜์„ฑ Java 9 ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋จ Java 9 ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ

JDK 9๋ถ€ํ„ฐ Java๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CLDR๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” CLDR๊ฐ€ COMPAT๋ณด๋‹ค ๋” ์ •ํ™•ํ•˜๊ณ  ๊ด‘๋ฒ”์œ„ํ•œ ์–ธ์–ด ๋ฐ ๋ฌธํ™”๊ถŒ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ COMPAT๋Š” ์—ฌ์ „ํžˆ Java์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. java.locale.providers=COMPAT ์‹œ์Šคํ…œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ COMPAT๋ฅผ ๊ธฐ๋ณธ ๋กœ์ผ€์ผ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JAR index ๊ธฐ๋Šฅ ์ œ๊ฑฐ (JDK-8302819)

JAR index ๊ธฐ๋Šฅ์€ JDK 21์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JAR index ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ์• ํ”Œ๋ฆฟ(applets)์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๊ธฐ์ˆ ๋กœ์จ, ํ˜„์žฌ๋Š” ๊ณผ๊ฑฐ์˜ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. JAR index ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋Œ€์ฒด ๊ธฐ๋Šฅ์€ ์—†์œผ๋ฉฐ, i, -generate-index๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ: JDK-8302819

JAR index ๊ธฐ๋Šฅ์ด๋ž€?

Java Archive(JAR) ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. JAR ํŒŒ์ผ์€ Java ํด๋ž˜์Šค, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ, ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ ํŒŒ์ผ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. JAR index ๊ธฐ๋Šฅ์€ JAR ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ธ๋ฑ์‹ฑํ•˜์—ฌ, ํŠน์ • ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ ๊ธฐ์กด์˜ jar ๋ช…๋ น์–ด๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. JAR index ๊ธฐ๋Šฅ์€ Java 7๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ jar -i ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JAR index ๊ธฐ๋Šฅ์˜ ์žฅ์ 

  • JAR ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JAR ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JAR ํŒŒ์ผ์˜ ์••์ถ•๋ฅ ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JAR index ๊ธฐ๋Šฅ์˜ ๋‹จ์ 

  • JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • JAR ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

JAR index ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

JAR index ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


jar -i [jar_file]


์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด JAR index ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.


jar -i my-jar.jar


JAR index ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ JAR ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.


Index created for my-jar.jar


JAR index ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ JAR ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ JAR ํŒŒ์ผ์„ ์ฝ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


jar -xf [jar_file]


์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด JAR ํŒŒ์ผ์„ ์ฝ์œผ๋ฉด JAR index ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


jar -xf my-jar.jar

 

 

์ฆ๊ฑฐ์šด ์ฝ”๋”ฉํ•˜์„ธ์š”!

728x90
728x90