Develope/Programming

[JAVA] 2차원 배열 Deep copy, swallow Copy

고로이 2017. 12. 4. 12:49
반응형

배열을 쓰다보면 복사도 자주 하게 되는데



a[i] = b[i]


이런식으로 복사를 하다가는


한쪽의 값을 수정하면 다른 한쪽의 값도 함께 변경되는 병신같은 일이 일어난다.



애초에 = 이라는 연산자는


주소를 이어준다는 의미이기 때문인데


이를 Swallow Copy. 얕은 복사라고 한다.




좋은 글이 있으니 첨부한다. 얕은 복사와 깊은 복사를 이해하는데 좋은 글


http://library1008.tistory.com/47

https://blueshw.github.io/2016/01/20/2016-01-20-shallow-copy-deep-copy/







이를 타개하기 위해서는


내가 자주쓰는 ArrayList는


list.copyAll() 함수를 지원해주기에 문제없는데  (list.addAll() 도 많이 쓴다.)


배열이 문제였다.





1차원 배열의 경우


int[] listA = new int[10];
int[] listB = listA.clone();

위와 같이 클론을 해주면 땡이다.




하지만 2차원배열은 그거시 되지 않는다



여기서 잠깐 2차원배열의 구조를 다시 상기시켜보자면




만약 다음과 같이 2차원배열을 선언하면 구조는 아래 사진과 같다.

int[][] x = new int[3][5];

2차원배열에 대한 이미지 검색결과

출처 : http://mattlee.tistory.com/51




이런 의미에서 array copy를 해봣자


x 값에는 y좌표를 가르키는 주소값이 들어가기 때문에


결국 DeepCopy가 되지 않는다는 것 ㅠ


x 좌표만 deepCopy 됌..




2차원 배열의 deepCopy를 위해서는



https://stackoverflow.com/questions/1564832/how-do-i-do-a-deep-copy-of-a-2d-array-in-java


public static String[][] deepCopy(String[][] original, int n) {
if (original == null) {
return null;
}

String[][] result = new String[n][n];
for (int i = 0; i < original.length; i++) {
System.arraycopy(original[i], 0, result[i], 0, original[i].length);
}
return result;
}


다음과 같은 함수를 만들었다.



반응형