IT_Programming/Java

Finalize Guardian Idiom

JJun ™ 2010. 2. 25. 15:54

-----------------------------------------------------------------------------------

 

[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