์๋ !
์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ด ์ ํ๋์ด ์๋ค๊ณ ๋งํด๋ ๋๋ผ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค :) ์ผ๋ฐ์ ์ผ๋ก 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์ ๊ฐ๋น์ง ์์ง๊ธฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ฒญ์ํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง์ ๊ฐ์ฒด๊ฐ ๋จ์ ์๋ ๊ฒฝ์ฐ(์: ๋ก๋ด ์ง๊ณต ์ฒญ์๊ธฐ์ ์๋ง ๋๋ ๋ ๊ณ ๋น๋ฉ ๋ธ๋ก) ์ด๋ ์์ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๊ฒ์ ๋๋ค. ์ ์ง๋๋ ๊ฒ์ ๊ทํ์ ํ๋ก๊ทธ๋จ๋ง์ด ์๋๋ผ ์ปดํจํฐ์์ ์คํ ์ค์ธ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค. ๊ทธ๋ค๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ธ์ธ ํ์๋ ์์ต๋๋ค. ์๋ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.