[자바 객체 복사, Java Object clone, cloning]Shallow copy vs. Deep
copy
자바에서 객체 복사는 Object 클래스의 clone 메소드가 담당 하는데 ...
- protected Object clone() throws CloneNotSupportedException
객체의 모든 인스턴스 변수 값을 복제
반드시 Cloneable 인터페이스를 구현해야 한다.
일반 프로그램, 외부 패키지에서도 복제가 가능하게 하려면 public으로 정의해야하며 원본과 정확히 똑 같은 상태를 나타낼 수도 있고 아닐 수 도 있다.(원본 객체에 의해 결정)
두 객체는 equals() 메소드로 같다는 결과를 얻지만 ==로 비교시에는 다른 객체임
해당 객체와 같은 형의 객체를 똑같이 만들고 나서 해당 객체의 내부 필드들을 그대로 가리키게 한다. 즉 겉모습만 복사하고 나서 내부는 같이 사용한다.
반드시 Cloneable 인터페이스를 구현해야 한다.
일반 프로그램, 외부 패키지에서도 복제가 가능하게 하려면 public으로 정의해야하며 원본과 정확히 똑 같은 상태를 나타낼 수도 있고 아닐 수 도 있다.(원본 객체에 의해 결정)
두 객체는 equals() 메소드로 같다는 결과를 얻지만 ==로 비교시에는 다른 객체임
해당 객체와 같은 형의 객체를 똑같이 만들고 나서 해당 객체의 내부 필드들을 그대로 가리키게 한다. 즉 겉모습만 복사하고 나서 내부는 같이 사용한다.
1. Shallow copy vs. Deep copy
Shallow copy : 인스턴스 변수인 경우엔 내용을 별도의 영역에 복사, 객체와 같이 참조 값을 가리키는 것은 같은 내용을
사용한다.
Deep copy : 모든 것들이 별도의 메모리 영역에 존재하도록 한다.
Deep copy : 모든 것들이 별도의 메모리 영역에 존재하도록 한다.
배열 복제
배열은 public clone()으로 재정의 되어 있음
배열의 clone()은 첫번째 차원의 원소만을 복제함
배열은 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] );
}
}
{
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}; // 배열인 경우 참조값만 복사됨
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] );
}
}
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
obj1.i = 2, obj2.i = 1
obj1.arr[0] = 2, obj2.arr[0] = 2
[개강임박강좌, 오프라인교육장에 오시면 보다 자세히 배울 수 있습니다.]
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[11/18]Spring3.X, MyBatis, Hibernate실무과정
[11/18]iPhone 하이브리드 앱 개발 실무과정
[11/20]SQL초보에서실전전문가까지
[11/20]안드로이드개발자과정
[평일야간]
[11/13]C#,ASP.NET마스터
[11/19]iPhone하이브리드앱개발실무과정
[11/19]안드로이드개발자과정
[11/20]초보자를위한실전SQL
[11/21]JAVA&WEB프레임워자실무과정
[11/21]Spring3.X, MyBatis, Hibernate실무과정
[주말]
[11/16]JAVA&WEB프레임워크실무과정
[11/16]웹퍼블리싱 마스터
[11/16]Spring3.X,MyBatis,Hibernate실무과정
[11/16]SQL초보에서전문가까지
[11/16]PL/SQL,오라클힌트,SQL튜닝,사례연구
[11/23]C#,ASP.NET마스터
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[11/18]Spring3.X, MyBatis, Hibernate실무과정
[11/18]iPhone 하이브리드 앱 개발 실무과정
[11/20]SQL초보에서실전전문가까지
[11/20]안드로이드개발자과정
[평일야간]
[11/13]C#,ASP.NET마스터
[11/19]iPhone하이브리드앱개발실무과정
[11/19]안드로이드개발자과정
[11/20]초보자를위한실전SQL
[11/21]JAVA&WEB프레임워자실무과정
[11/21]Spring3.X, MyBatis, Hibernate실무과정
[주말]
[11/16]JAVA&WEB프레임워크실무과정
[11/16]웹퍼블리싱 마스터
[11/16]Spring3.X,MyBatis,Hibernate실무과정
[11/16]SQL초보에서전문가까지
[11/16]PL/SQL,오라클힌트,SQL튜닝,사례연구
[11/23]C#,ASP.NET마스터
댓글 없음:
댓글 쓰기