์•ˆ๋…•!

์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ์ œํ•œ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋งํ•ด๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :) ์ผ๋ฐ˜์ ์œผ๋กœ RAM ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ํฐ ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ๋„ ์ข‹์•„ํ•˜๋Š” ๊ฒŒ์ž„, TV ์‡ผ, ๊ทธ๋ฆฌ๊ณ  ๋”. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ปดํ“จํ„ฐ์—์„œ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ด ๋ชจ๋“  ๊ฒƒ๊ณผ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ๊ฒƒ! ๊ฒฐ๊ตญ Java ๋จธ์‹ ์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ˆ˜๋งŒ, ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ๊ฐ ๊ฐœ์ฒด์—๋Š” ํ• ๋‹น๋œ ์ž์ฒด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ์ „์ฒด ์‹œ๊ฐ„ ๋™์•ˆ "๋ผ์ด๋ธŒ"ํ•ฉ๋‹ˆ๊นŒ? ๋‹น์—ฐํžˆ ์•„๋‹ˆ์ง€. Java ๊ฐ์ฒด์˜ ๋ชจ๋“  ์žฅ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ์ฒด๋Š” ๋ถˆ๋ฉธ์ด ์•„๋‹™๋‹ˆ๋‹ค. :) ๊ฐ์ฒด์—๋Š” ์ž์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์—์„œ ์•ฝ๊ฐ„์˜ ํœด์‹์„ ์ทจํ•˜๊ณ  ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค :) ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ๋ฌผ์˜ ์ƒ๋ช…์€ ์–ธ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์‚ฌ๋žŒ์ฒ˜๋Ÿผ โ€” ํƒœ์–ด๋‚  ๋•Œ๋ถ€ํ„ฐ, ์ฆ‰ ์ฐฝ์กฐ๋ถ€ํ„ฐ.

Cat cat = new Cat(); // Here the lifecycle of our Cat object begins!

๋จผ์ € JVM(Java Virtual Machine)์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ฐธ์กฐ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ cat์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ณ  ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ โ€” ์งœ์ž”! โ€” ์šฐ๋ฆฌ์˜ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฌผ๊ฑด์€ ์ž์‹ ์˜ ์‚ถ์„ ์‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)

๋ฌผ์ฒด์˜ ์ˆ˜๋ช…์€ ๋‹ค์–‘ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ •ํ™•ํ•œ ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ์–ผ๋งˆ ๋™์•ˆ ์‚ด๋ฉฐ ๊ทธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ๊ฐœ์ฒด๋Š” ์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ํ•œ "ํ™œ์„ฑ"์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ฐธ์กฐ๊ฐ€ ๋‚จ์ง€ ์•Š๋Š” ์ฆ‰์‹œ ๊ฐ์ฒด๋Š” "์ฃฝ์Šต๋‹ˆ๋‹ค". ์˜ˆ:

public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");
       lamborghini = null;

   }

}

Lamborghini Diablo ์ž๋™์ฐจ ๊ฐœ์ฒด๋Š” ๋ฉ”์„œ๋“œ์˜ ๋‘ ๋ฒˆ์งธ ์ค„์—์„œ ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค main(). ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋Š” ํ•˜๋‚˜๋ฟ์ด์—ˆ๊ณ  ํ•ด๋‹น ์ฐธ์กฐ๋Š” ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค null. Lamborghini Diablo์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” "์“ฐ๋ ˆ๊ธฐ"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฐธ์กฐ๋ฅผ null๋กœ ์„ค์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");

       Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
       lamborghini = lamborghiniGallardo;
   }

}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์งธ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ด ์ƒˆ ๊ฐœ์ฒด๋ฅผ ์ฐธ์กฐ์— ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค lamborghini. ์ด์ œ Lamborghini Gallardo๊ฐœ์ฒด์—๋Š” ๋‘ ๊ฐœ์˜ ์ฐธ์กฐ๊ฐ€ ์žˆ์ง€๋งŒ Lamborghini Diablo๊ฐœ์ฒด์—๋Š” ์ฐธ์กฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, Diablo๊ฐ์ฒด๊ฐ€ ์ด์ œ ๊ฐ€๋น„์ง€์ž…๋‹ˆ๋‹ค. ์ด๋•Œ GC(๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ)๋ผ๋Š” Java์˜ ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ, ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ๊ฐœ์ฒด ์ œ๊ฑฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด๋ถ€ Java ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ ์‚ฌ์ง„์„ ์„ ํƒํ•œ ๋ฐ๋Š” ๊ทธ๋งŒํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๊ฑฐ์˜ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด "์ด๋™"ํ•˜์—ฌ ์‚ฌ์‹ค์ƒ ์‚ฌ์šฉ์ž์˜ ๋…ธ๋ ฅ ์—†์ด ๊ฐ€๋น„์ง€๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ์ž„๋ฌด๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ์ฒด๋ฅผ ์œ„ํ•ด ์ปดํ“จํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜์—… ์ดˆ๋ฐ˜์— ์ผ์ƒ ์ƒํ™œ์—์„œ ์ปดํ“จํ„ฐ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์„ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? Java ๊ฐœ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ช…๋ น์„ ๋‚ด๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ด์•ผ๊ธฐํ•˜๊ณ  ๊ทธ ์ž‘์—…์„ ๋” ์ž์„ธํžˆ ๋ถ„์„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐœ์ฒด์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐœ์ฒด๋ฅผ ํŒŒ๊ดดํ•˜๊ธฐ ์ง์ „์— finalize()๊ฐœ์ฒด์— ๋Œ€ํ•œ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ โ€” โ€”๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๊ฐœ์ฒด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋Š” ํด๋ž˜์Šค finalize()์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค Object. ์ฆ‰, ์ด์ „์— ๋งŒ๋‚œ equals(), hashCode()๋ฐ ๋ฉ”์„œ๋“œ ์™ธ์—๋„ ๋ชจ๋“  ๊ฐœ์ฒด์— ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. toString()๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅธ ์ ์€ - ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ• ๊นŒ์š” - ๋งค์šฐ ๋ณ€๋•์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ „์— ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ •ํ™•ํ•œ ๋…ธ๋ ฅ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ปดํ“จํ„ฐ์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ผ๊ณ  ์ง€์‹œํ•˜๊ณ  ์ปดํ“จํ„ฐ๋Š” ๊ทธ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋ฏธ ์ด ํ–‰๋™์— ์ต์ˆ™ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ๊ฐ์„ ๋ฐ›์•„๋“ค์ด๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: "๊ฐ์ฒด๊ฐ€ ํŒŒ๊ดด๋˜๊ธฐ ์ „์— ํด๋ž˜์Šค finalize()์˜ ๋ฉ”์„œ๋“œ๊ฐ€ Objectํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ํ–‰์šด!"

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

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public Cat() {
   }

   public static void main(String[] args) throws Throwable {
       for (int i = 0 ; i < 1000000; i++) {
           Cat cat = new Cat();
           cat = null; // This is when the first object becomes available to the garbage collector
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Cat object destroyed!");
   }
}

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ Cat๋‹ค์Œ ๋‹ค์Œ ์ฝ”๋“œ ์ค„์—์„œ ์œ ์ผํ•œ ์ฐธ์กฐ๋ฅผ null๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ฐฑ๋งŒ ๋ฒˆ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์žฌ์ •์˜ํ•˜์—ฌ finalize()๋ฌธ์ž์—ด์„ ์ฝ˜์†”์— ๋ฐฑ๋งŒ ๋ฒˆ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค(๊ฐœ์ฒด๋ฅผ ํŒŒ๊ดดํ•  ๋•Œ๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ Cat). ํ•˜์ง€๋งŒ! ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ๋‚ด ์ปดํ“จํ„ฐ์—์„œ 37,346ํšŒ๋งŒ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ฆ‰, 27๋ฒˆ ์ค‘ ํ•œ ๋ฒˆ๋งŒ ๋‚ด ์ปดํ“จํ„ฐ์— ์„ค์น˜๋œ Java ์ปดํ“จํ„ฐ๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค finalize().

๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ด ๊ทธ๊ฒƒ ์—†์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค. ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ finalize()์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒํŠธ๋„ˆ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :) ๋”ฐ๋ผ์„œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ์ž‘์€ ์กฐ์–ธ: finalize()์ค‘์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์˜์กดํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. JVM์ด ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์•Œ์•„?

๊ฐœ์ฒด๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ์„ฑ๋Šฅ์— ๋งค์šฐ ์ค‘์š”ํ•œ ์ผ๋ถ€ ๋ฆฌ์†Œ์Šค(์˜ˆ: ์—ด๋ฆฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ)๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค์—์„œ ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด์ œํ•œ ๋‹ค์Œ ๊ฐœ์ฒด๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ž‘์—…ํ•˜๊ณ  ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋งํ–ˆ๊ณ  ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๊ฐœ์ฒด๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜๋ชป ์ดํ•ดํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค์ˆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์„ ์™ธ์šธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.