배열을 쓰다보면 복사도 자주 하게 되는데
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];
출처 : 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;
}
다음과 같은 함수를 만들었다.
'Develope > Programming' 카테고리의 다른 글
[JAVA] Gmail API 이용해서 메일 보내기 (파일 첨부) (0) | 2018.03.19 |
---|---|
[Kafka] 1. 카프카 설치 및 실행 (분산 클러스터링) (0) | 2018.01.04 |
[JAVA] Mapped Statements collection already contains value (1) | 2017.11.16 |
[JAVA] cvs 파일로 Export하기 (+180307 charset (1) | 2017.11.09 |
[JAVA] 특정 날짜의 리스트 가져오기 (1) | 2017.11.06 |