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;
}