Java의 배열 복사에는 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)가 있다.
얕은 복사(Shallow Copy)
는 단순히 배열의 주솟값을 복사하여 가져오는 방법이다.깊은 복사(Deep Copy)
는 새 배열에 완전히 덮어씌우는 방법이다.얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)를 사용하는 방법이 다르다.
int[] rootArr = {1, 2, 3, 4, 5};
int[] newArr = rootArr;
newArr[0] = 100;
//새로운 배열을 바꾸면 원본 배열의 값이 바뀐다
for(int val : rootArr) {
System.out.print(val+" ");
}
>>> 100 2 3 4 5
rootArr.clone();
을 사용하여 복사할 수 있다. int[] rootArr = {1, 2, 3, 4, 5};
int[] newArr = rootArr.clone();
newArr[0] = 100;
// 원본 배열의 값은 변하지 않는다.
for(int val : rootArr) {
System.out.print(val+" ");
}
>>> 1 2 3 4 5
// 새로운 배열의 값만 변한다.
for(int val : newArr) {
System.out.print(val+" ");
}
>>> 100 2 3 4 5
newArr.clone();
을 사용해도 얕은 복사가 된다. int[][] rootArr = {{1, 2, 3, 4, 5},
{11, 12, 13, 14, 15}};
int[][] newArrA = rootArr;
int[][] newArrB = rootArr.clone();
// 단순 변수 선언 시 원본 배열도 값이 바뀜
newArrA[0][0] = 100;
System.out.println(rootArr[0][0]);
>>> 100
// clone()을 쓴 배열을 바꾸면 원본 배열도 값이 바뀜
newArrB[1][1] = 555;
System.out.println(newArrB[1][1]);
>>> 555
반복문 + System.arraycopy()
을 사용하여 복사한다.System.arraycopy(원래 배열, 원래 배열 시작 위치, 새 배열, 새 배열 시작 위치, 길이)
int[][] rootArr = {{1, 2, 3, 4, 5},
{11, 12, 13, 14, 15}};
// newArrA : rootArr와 같은 사이즈로 만든 후, 2중 반복문을 통한 복사
int[][] newArrA = new int[rootArr.length][rootArr[0].length];
for(int i = 0; i < rootArr.length; i++){ // 2중 반복문
for(int j = 0 ; j < rootArr[0].length; j++){
newArrA[i][j] = rootArr[i][j];
}
}
// newArrB : rootArr와 같은 사이즈로 만든 후, 반복문 + arraycopy 사용하여 복사
int[][] newArrB = new int[rootArr.length][rootArr[0].length]; // C 선언,
for(int i = 0; i < rootArr.length; i++){ // 반복문 + ArrayCopy
System.arraycopy(rootArr[i], 0, rootArr[i], 0, rootArr[i].length);
}
newArrA[0][0] = 100;
newArrB[1][1] = 500;
// newArrA을 바꿔도 rootArr 값이 바뀌지 않는다.
System.out.println(rootArr[0][0]);
>>> 1
// newArrB을 바꿔도 rootArr 값이 바뀌지 않는다.
System.out.println(rootArr[1][1]);
>>> 1