clone()의 구현
JAVA/기본 2007. 5. 29. 20:36▣ Object 의 clone() 메서드의 접근
1. clone() 메서드의 접근지정자가 protected로 외부 접근이 불가능하기 때문에, 내부에서 재정의 한 후 super로 접근해야 한다.
2. 재정의된 public 메서드의 이름이 clone()이라면 메서드의 이름이 충돌하기 때문에 super.clone()을 사용해서 object()의 clone()을 호출한다.
▣ 객체복사 방법
1. 이미 구현된 Cloneable 인터페이스의 clone() 메서드 사용
2. Cloneable 인터페이스를 직접 구현
public class ArrayParam extends Object implements Cloneable{
//메서드
public int[] copyArray(int[] src) {
int[] des = (int[])src.clone();
/* int[] des = new int[src.length];
for(int i =0; i<src.length; i++)
des[i] = src[i];
*/
return des;
}
//clone메서드 재정의
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public static void main(String args[]) throws CloneNotSupportedException{
int[] source = new int[]{1,2,3,4,5};
ArrayParam p = new ArrayParam();
int[] result = p.copyArray(source);
for(int i =0; i<result.length ;i++){
System.out.println("result["+i+"] : " + result[i]);
}
System.out.println();
source[0] = 5;
for(int i =0; i<source.length ;i++){
System.out.println("source["+i+"] : " + source[i]);
}
//두개의 헤쉬코드는 틀림
System.out.println(result.hashCode());
System.out.println(source.hashCode());
//객체로 한번 클론을 만들어보자..
ArrayParam test1 = new ArrayParam();
ArrayParam test2 = (ArrayParam)test1.clone();
//이 두놈의 헤쉬 코드도 틀림
System.out.println(test1.hashCode());
System.out.println(test2.hashCode());
}
result[0] : 1
result[1] : 2
result[2] : 3
result[3] : 4
result[4] : 5
source[1] : 2
source[2] : 3
source[3] : 4
source[4] : 5
8187137
28050664
7754385
2548785
API에서는 클론을 사용하더라도 얕은복사(Shallow Copy)가 이루어 진다고 했는데 위의 테스트로서는 해쉬코드가 틀리기 때문에 깊은 복사로 나타났다.
clone()의 내부 알고리즘은 무엇일까....ㅡ_ㅡ