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)