class FinalizeTest
{
@Override
public void finalize() throws Throwable
{
System.out.println("finalize() 메소드 호출됨");
}
public static void main(String[] args)
{
FinalizeTest ins = new FinalizeTest();
try
{
Thread.sleep(3000);
}
catch (InterruptedException e)
{
}
ins = null;
System.gc();
System.out.println("제일 마지막 코드! 마지막 출력문이다.");
}
}//////////////////////////////
------------------------------------------------------------------------------------------
finalize() 메소드는 가비지 컬렉터가 객체를 소멸시키기 전에 호출이 되어집니다. 현재 위의 코드를 보게되면
finalize() 메소드는 main()메소드에서 호출이 되어있지 않습니다. 하지만 결과물을 보게 되면 finalize()
호출 된 것을 볼 수 있습니다. 그것은 위에서도 설명했다 싶이 finalize() 메소드가 객체를 소멸시키기 전
즉 가비지 컬렉터가 수행하기 바로 직전에 출력된 것을 볼 수 있습니다. 그리고 나서 마지막 문자열을 출력된 것을 볼 수
있습니다. (3초간 스레드가 대기상태에 있도록 구현하였습니다. 가비지컬렉터가 수행되고 난 이후라는점을 강조하였습니다.)
그리고 가비지 컬렉터가 수행하게 되는 이유는 ins 참조변수에 null값을 넣어서 FinalizeTest객체를
가비지 컬렉터의 대상이 되도록 하였습니다.
이 상태에서 System.gc(); 메소드를 사용하여 가비지 컬렉터가 수행(run)이 되도록 한 것입니다.
위와같은 사실로 finalize() 메소드가 언제 호출되는지 알 수 있습니다.
또한 finalize() 메소드의 사용용도는 객체가 소멸되기 바로 직전에 어떤 처리해야 할
코드가 있을때 사용되어집니다.
'Java' 카테고리의 다른 글
interface 끼리의 상속관계 (0) | 2013.07.25 |
---|---|
StackOverflowError / SCJP 174번 문제 (0) | 2013.07.25 |
접근지정자의 접근범위 (0) | 2013.07.25 |
SCJP 80번 문제 / synchronized (0) | 2013.07.25 |
각종 예외의 발생조건과 의미 (0) | 2013.07.25 |