2013년 11월 11일 월요일

[자바 객체 복사, Java Object clone, cloning]Shallow copy vs. Deep copy 자바에서 객체 복사는 Object 클래스의 clone 메소드가 담당 하는데...


[자바 객체 복사, Java Object clone, cloning]Shallow copy vs. Deep copy
 
자바에서 객체 복사는 Object 클래스의 clone 메소드가 담당 하는데 ...
 
- protected Object clone() throws CloneNotSupportedException
 
객체의 모든 인스턴스 변수 값을 복제
반드시 Cloneable 인터페이스를 구현해야 한다.
일반 프로그램, 외부 패키지에서도 복제가 가능하게 하려면 public으로 정의해야하며 원본과 정확히 똑 같은 상태를 나타낼 수도 있고 아닐 수 도 있다.(원본 객체에 의해 결정)
두 객체는 equals() 메소드로 같다는 결과를 얻지만 ==로 비교시에는 다른 객체임
해당 객체와 같은 형의 객체를 똑같이 만들고 나서 해당 객체의 내부 필드들을 그대로 가리키게 한다. 즉 겉모습만 복사하고 나서 내부는 같이 사용한다.

1. Shallow copy vs. Deep copy
 
Shallow copy : 인스턴스 변수인 경우엔 내용을 별도의 영역에 복사, 객체와 같이 참조 값을 가리키는 것은 같은 내용을 사용한다.
Deep copy : 모든 것들이 별도의 메모리 영역에 존재하도록 한다.
배열 복제
배열은 public clone()으로 재정의 되어 있음
배열의 clone()은 첫번째 차원의 원소만을 복제함

배열복제
 
class CloneTest
{  
    public static void main( String[] args )
    {
        int[] array = {1, 2, 3, 4};
        int[] array2 = array;
        int[] array3 = (int[]) array.clone();
        ++array[0];
        System.out.println( array[0] + ", " + array2[0] + ", “
             + array3[0] );
    }
}

[결과]
2,2,1
 
Shallow Copy 예제
 
//복제가 되기 위해서는 Cloneable Maker 인퍼페이스를 구현해야 한다.
class DefClone implements Cloneable // clone() 허용
{
    int i = 1;                    //인스턴스 변수의 경우 별도의 영역에 값이 복사
  int arr[] = {1, 2, 3};   // 배열인 경우 참조값만 복사됨
    public static void main( String[] args )
        throws CloneNotSupportedException
    {
        DefClone obj1 = new DefClone();
        DefClone obj2 = (DefClone) obj1.clone();
        obj1.i = obj1.arr[0] = 2;
        System.out.println( "obj1.i = " + obj1.i
                            + ", obj2.i = " + obj2.i );
        System.out.println( "obj1.arr[0] = " + obj1.arr[0]
                            + ", obj2.arr[0] = " + obj2.arr[0] );
    }
}
실행 결과
obj1.i = 2, obj2.i = 1
obj1.arr[0] = 2, obj2.arr[0] = 2

댓글 없음:

댓글 쓰기