[자바 객체 복사, Java Object clone, cloning]
자바에서 객체 복사는 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)
[주간]
[01/06][기업100%환급]Spring ,MyBatis,Hibernate실무과정
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[01/06]C#,ASP.NET마스터
[01/13]iPhone 하이브리드 앱 개발 실무과정
[01/13][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[01/13][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/13][기업100%환급]HTML5,JavaScript,Ajax,jQUERY,JSON
[01/16][채용확정]오라클자바실무개발자신입과정
[평일야간]
[01/07]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[01/07]안드로이드개발자과정
[01/08]C#,ASP.NET마스터
[01/09]iPhone하이브리드앱개발실무과정
[01/09]웹퍼블리싱 마스터
[01/09]Spring3.X, MyBatis, Hibernate실무과정
[01/24]SQL초보에서실전전문가까지
[주말]
[01/04]닷넷실무자를위한WPF개발자과정
[01/04]Spring3.X,MyBatis,Hibernate실무과정
[01/11]C#,ASP.NET마스터
[01/11]JAVA&WEB프레임워크실무과정
[01/11]안드로이드개발자과정
[01/11]SQL초보에서전문가까지
[01/18]웹퍼블리싱 마스터
오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)
[주간]
[01/06][기업100%환급]Spring ,MyBatis,Hibernate실무과정
[01/06][기업100%환급]SQL기초에서 Schema Object까지
[01/06]C#,ASP.NET마스터
[01/13]iPhone 하이브리드 앱 개발 실무과정
[01/13][기업100%환급]PL/SQL,ORACLE HINT,TUNING
[01/13][기업100%환급]자바기초에서 JDBC, Servlet/JSP까지
[01/13][기업100%환급]HTML5,JavaScript,Ajax,jQUERY,JSON
[01/16][채용확정]오라클자바실무개발자신입과정
[평일야간]
[01/07]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지
[01/07]안드로이드개발자과정
[01/08]C#,ASP.NET마스터
[01/09]iPhone하이브리드앱개발실무과정
[01/09]웹퍼블리싱 마스터
[01/09]Spring3.X, MyBatis, Hibernate실무과정
[01/24]SQL초보에서실전전문가까지
[주말]
[01/04]닷넷실무자를위한WPF개발자과정
[01/04]Spring3.X,MyBatis,Hibernate실무과정
[01/11]C#,ASP.NET마스터
[01/11]JAVA&WEB프레임워크실무과정
[01/11]안드로이드개발자과정
[01/11]SQL초보에서전문가까지
[01/18]웹퍼블리싱 마스터
홈페이지 바로가기 : http://www.oraclejavanew.kr/
댓글 없음:
댓글 쓰기