주소값을 복사하면 얕은 복사, 실제 값을 복사하면 깊은 복사 !!!
기본형 변수를 제외한 거의 모든 변수들은 참조형 변수로 실제 값을 가르키는 것이 아닌
주소값을 가르키고 있다.
예제를 통해 주소값을 보며 실제 변수가 저장된 위치를 알아보자.
주소를 불러오는 방법은 chatGPT에게 물어보았다.

위 함수로 실제 주소값은 불러올 수 없다. JVM에 의해 메모리 관리가 abstracted away (추상화 되었다?) 되었기 때문에 주소값에 상응하는 다른 값을 보여주는 듯 하다.
int[] a = {1,2,3};
int[] b = a; // 얕은 복사
System.out.println(System.identityHashCode(a)); //2003749087
System.out.println(System.identityHashCode(b)); //2003749087
변수 a는 배열의 주소값이므로 b도 당연히 같은 주소값이 나온다.
자 그러면 위 방식이 아닌 진짜 값을 복사하기 위해선 어떻게 해야할까?
1. 배열일 경우 반복문으로 배열의 값을 하나하나 복사해주는 방법이 있겠다.
int[] a = {1,2,3};
int[] b = new int[a.length];
for(int i=0; i<a.length;i++){
b[i]=a[i]; //깊은 복사
}
System.out.println(System.identityHashCode(a)); //2003749087
System.out.println(System.identityHashCode(b)); //1324119927
주소값이 다른 것을 볼 수 있다.
2. clone()을 사용하면 간단하지만 2차원 배열일 경우 얕은 복사가 된다.
int[] a = {1,2,3};
int[] b = a.clone();
int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
int[][] b = a.clone();
System.out.println(System.identityHashCode(a)); //2003749087
System.out.println(System.identityHashCode(b)); //1324119927
System.out.println(System.identityHashCode(a[0])); //990368553
System.out.println(System.identityHashCode(a[1])); //1096979270
System.out.println(System.identityHashCode(a[2])); //1078694789
System.out.println(System.identityHashCode(b[0])); //990368553
System.out.println(System.identityHashCode(b[1])); //1096979270
System.out.println(System.identityHashCode(b[2])); //1078694789
a와 b의 주소값은 다르지만 a[] 와 b[]의 주소값이 같다.
Arrays.copyOf(); 를 사용해봤지만 같은 문제가 발생했다...
결국 반복문을 통해서 하나하나 깊은 복사를 해주어야한다....
int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
int[][] b = Arrays.copyOf(a,a.length);
for(int i =0; i<a.length;i++){
b[i]= Arrays.copyOf(a[i],a[i].length);
}
System.out.println(System.identityHashCode(a)); //2003749087
System.out.println(System.identityHashCode(b)); //1324119927
System.out.println(System.identityHashCode(a[0])); //003749087
System.out.println(System.identityHashCode(a[1])); //1096979270
System.out.println(System.identityHashCode(a[2])); //1078694789
System.out.println(System.identityHashCode(b[0])); //1831932724
System.out.println(System.identityHashCode(b[1])); //1747585824
System.out.println(System.identityHashCode(b[2])); //1023892928
비로소 각각의 주소가 다 달라진 것을 볼 수 있다.
++ a[0][1]=10
다음 b[0][1] 을 출력하면 여전히 2가 나오는 것으로 보아 깊은 복사가 된 것 같지만 주소값을 출력해보면
a[0][1], b[0][1]이 같다. 2차원 요소의 주소값은 똑같이 나오는데 값을 변경해도 서로 영향은 주지 않는다.... 머리가 아프다... 좀 더 알아봐야겠다.