JAVA 배열의 주소의 개념..
2023. 10. 18. 02:39ㆍ카테고리 없음
배열의 기본적인 개념과 주소값 및 순서에 대한 이해는 하였는데..
일반적인 변수를 복사하는것과 다르게, 배열에서는 깊은 복사 얕은 복사가 있는 것이었다.
얕은 복사
얕은 복사는 일반적인 변숫값을 복사할 때와 같이
int[]a={1,2,3,4};
int[]b=a;
b[0]=3;
이런 식으로 사용하게 되면 문제가 발생하는 것이다.
두 번째 줄과 같이 b배열에 a배열을 복사하게 되면, 내부의 변수가 b배열에 고스란히 들어가는 게 아닌
b배열의 주소값이 들어가게 되어서 세 번째 줄과 같이 배열의 값을 변경 시에 같은 주소를 가리키고 있는
a배열의 0번째 값 역시 변경되어 버리는 것이다.
깊은 복사
이 문제를 해결하는 방법이 깊은 복사인데 내가 생각하기엔 그냥 일일이 붙이기에 가깝다.
쉽게말해 배열의 각 값을 전부 끄집어내서 복사할 배열에 붙여넣는건데 이렇게 할시 완벽히 별개의 배열이되며
그저 둘은 같은 값을 가지는 배열일 뿐이다.
이렇것을 도와주는 메소드가 있는데
clone() 이것이다.
근데 이 클론 메소드는 문제가 2차원 이상 배열에서는 얕은 복사로 동작해버려서 결국 원상태 복귀이기에
확실하게 복사하기 위해선 결국 깊은 복사를 해주는것이 제일인것 같다.
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i]; // 깊은 복사
}
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)