'JAVA/기본'에 해당되는 글 2건

  1. 2007.05.29 clone()의 구현
  2. 2007.05.29 배열의 복사

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()의 내부 알고리즘은 무엇일까....ㅡ_ㅡ

:

배열의 복사

JAVA/기본 2007. 5. 29. 15:26

배열은 객체 => 배열의 이름은 참조값
그러므로 당연히 할당은 참조값 복사 (같이 가르키고 있게 됨)


int[] 1학기점수 = new int[]{100, 90, 90, 30};
int[] 2학기점수 = 1학기점수; //참조값 복사




메모리 차원에서의 배열 복사

1. 부분배열 복사
System.arraycopy() 메서드를 이용

int[] source = new int[]{5, 4, 6, 9, 7, 9};
int[] target = {100, 200, 300, 400, 500, 600, 700};

System.arraycopy(source, 2, target, 3, 4};

결과
target[0]:100
target[1]:200
target[2]:300
target[3]:6
target[4]:9
target[5]:7
target[6]:9


2. 전체배열 복사
배열의 속성 clone() 메서드를 이용

int[] source = new int[]{5, 4, 6, 9, 7, 9};
int[] target = (int[])source.clone();

clone() 메서드는 메모리를 복사해서 Object형 객체를 리턴해주는 메서드
: