-----------------------------------------------------------------------------------
[Parents.java]
public class Parents
{
private final int ZERO_SIZE_ARRAY= 0;
private final String name = "부모";
private Object[] objects;
/************************************************************************************/
* @category Finalizer Guardian
*
* 이는 익명 클래스의 특징을 살린 기법으로 해당 클래스(Parents)가 GC 대상이 되면..
* 그 안에 생성된 익명 클래스 또한 GC 대상이 되면서 finalize() 함수를 호출하게 된다.
* Parents 클래스가 GC의 대상이 될 때 마찬가지로 finalizeGuardian 익명 클래스
* 또한 GC 대상이 되면서 메모리 해제 작업을 한다. 이 방식을 사용하면 상속 관계에서
* 최상위 클래스의 자원 해제를 자식 클래스가 일일이 신경쓰지 않아도 된다.
* 즉, super.finalize() 메서드를 자식 클래스에서 적어줄 필요가 없어진다.
*
* But, GC의 호출 타이밍을 정확히 알기 어려우므로 즉각적으로 자원을 해제 해야 한다면
* try~catch~finally 구문으로 각 클래스의 close(), dispose() 등의 종료 메서드를
* 사용하는 것이 좋다.
*/
private final Object finalizeGuardian = new Object() // 익명 클래스
{
protected void finalize() throws Throwable // finalize() 메서드 구현
{
// 여기서 자기 자신(finalizeGuardian)이 종료되면
// Parents 클래스의 내부 자원을 해제하는 구문을 넣는다.
// null 처리 해서 GC에 참조가 없다는 것을 알려줌으로써
// null 처리하는 이 구간에서 정확히 GC 처리 하는 것은 아니지만,
// 더이상의 참조가 없다는 것을 GC에 알려 GC 처리의 우선 순위를 미세하게나마 높일 수 있다.
objects = null;
if(objects == null) {
System.out.println("종료합니다.");
}
}
};
/************************************************************************************/
public Parents()
{
this.objects = new Object[ZERO_SIZE_ARRAY];
}
public void printName()
{
System.out.println(name);
}
}
-----------------------------------------------------------------------------------
[Child.java]
public class Child extends Parents
{
private final String name = "자식";
public Child()
{
super();
}
public void printName()
{
System.out.println(name);
}
}
-----------------------------------------------------------------------------------
[Main.java]
public class Main
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Parents parents = new Parents();
Child child = new Child();
parents.printName();
child.printName();
/**
* 강제적으로 GC 호출 - 부모 클래스든 그 부모의 자식 클래스든 메모리 해제 작업이 수행된다.
*/
parents = null; // Parents 객체 (Object[] objects)가 GC의 대상이 된다.
child = null; // Child 객체에서 Parents 객체 (Object[] objects)가 GC의 대상이 된다.
System.gc();
}
}
-----------------------------------------------------------------------------------
'IT_Programming > Java' 카테고리의 다른 글
JavaDOC 사용하기 (0) | 2010.03.15 |
---|---|
JavaDoc 유틸리티 (0) | 2010.03.15 |
[펌] Java에서 JavaScript호출하기 (0) | 2010.02.23 |
XML 문서에 Binary Data를 Insert하는 방법 (0) | 2010.02.05 |
JDOM (The Java DOM) (0) | 2010.02.02 |