'clone()'에 해당되는 글 1건

  1. 2007.05.29 clone()의 구현

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 class Test {

 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[0] : 5
source[1] : 2
source[2] : 3
source[3] : 4
source[4] : 5
8187137
28050664
7754385
2548785

API에서는 클론을 사용하더라도 얕은복사(Shallow Copy)가 이루어 진다고 했는데 위의 테스트로서는 해쉬코드가 틀리기 때문에 깊은 복사로 나타났다.
clone()의 내부 알고리즘은 무엇일까....ㅡ_ㅡ

: