Java

[Java기초] 다차원 배열 복제하기 (for문, clone() )

김도유 2022. 9. 2. 02:09
int[][] num2dim = { { 10, 20 }, { 30, 40 }, { 50, 60 }, { 70, 80 } };

					// ↓크기를 알수없을때
int [][] num2Copy = new int[num2dim.length][]; //new int[4][2];
		
//num2Copy[0] = new int[num2dim[0].length]; --1차원 배열 만들고 저장
//num2Copy[1] = new int[num2dim[1].length]; --1차원 배열 만들고 저장
		
        
//for문으로 1차원 배열 만들고 저장
for(int i = 0; i <num2Copy.length; i++) {
	num2Copy[i] = new int[num2dim[i].length];
}
printData(num2Copy); //printData()로 출력 -- 0 0 0 0 0 0 0 0 
		

//데이터 값 복제
for(int d2 = 0; d2 < num2dim.length; d2++) {
	for(int i = 0; i < num2dim[d2].length; i++) {
		num2Copy[d2][i] = num2dim[d2][i];
	}
 }
 printData(num2Copy); //10 20 100 40 50 60 70 80

 

물리적으로 분리되어있는 독립적인 완전한 복제를 위해서는 clone(), System.arraycopy(), Arrays.copyOf() 사용.

사용시 데이터를 저장하고 있는 객체를 대상으로 복제처리해야한다.

int[][] copyClone = num2dim.clone(); //주소값 복사
printData(copyClone); // 10 20 100 40 50 60 70 80 

copyClone[0][0] =777; // 777로 변경
printData(copyClone); // 777 20 100 40 50 60 70 80 

printData(num2Copy); // 10 20 100 40 999 60 70 80 

if(num2dim == num2Copy) {
	System.out.println("동일 객체");
} else {
	System.out.println("서로 독립된 객체");
}
//결과 : num2dim과 num2Copy은 동일 객체인가? : 서로 독립된 객체
		
        
System.out.print("num2dim과 copyClone은 동일 객체인가? : ");
if(num2dim == copyClone) {
	System.out.println("동일 객체");
} else {
	System.out.println("서로 독립된 객체");
}
//결과 : num2dim과 copyClone은 동일 객체인가? : 서로 독립된 객체

 

<clone() 메소드>

-자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.
-단순히 인스턴스 변수의 값만 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.

-clone()을 사용하려면, 복제할 클래스가 Cloneable 인터페이스를 구현해야 한다.

-접근 제어자가 protected이므로, 다른 클래스에서  clone()을 호출할 수 없다.

   => 해결방법 : clone() 메소드를 오버라이딩하면서 접근 제어자를 public 으로 변경

 @Override
  public Object clone() {
      Object obj = null;
      try {
          obj = super.clone();
      } catch (CloneNotSupportedException e) {
      }
      return obj;
  }