개념하고 결론이 상반되는데요..
얕은 복사는 참조 주소값을 복사하는 것이고
클론 메소드는 또 얕은 복사라고하던데(https://catsbi.oopy.io/16109e87-3c7e-4c6e-9816-c86e6b343cdd)
클론메소드 해서 해보니 주소값도 다르고 원본값에도 영향이 없던데.. 이 상황은 깊은복사가 아닌가요??
개념하고 결론이 상반되는데요..
얕은 복사는 참조 주소값을 복사하는 것이고
클론 메소드는 또 얕은 복사라고하던데(https://catsbi.oopy.io/16109e87-3c7e-4c6e-9816-c86e6b343cdd)
클론메소드 해서 해보니 주소값도 다르고 원본값에도 영향이 없던데.. 이 상황은 깊은복사가 아닌가요??
얕은 복사가 뭐냐면 객체를 복사하는데 새 객체를 생성해서 그 안에 값을 채워 넣어야 될거 아냐 근데 참조변수 필드는 실제 참조객체를 들고있는게 아니라 참조 메모리 주소를 들고있잖아 그 주소값만 가져다 복사해 넣는거라고
다시말하면 참조 객체가 메모리 상에 올라가 있으면 이 객체 안에는 실제로는 프리미티브 값이랑 참조 객체의 주소값만 들고있다는 거야 그거를 그냥 메모리를 좌악 긁어다가 그대로 붙여넣는게 얕은 복사라고
그러면 어떻게 되겠냐 복사된 객체 안에 있는 참조변수는 원본 객체 안의 참조변수랑 똑같은 메모리 주소 가리키고 있겠지 그러면 당연히 참조변수의 값을 수정하면 원본 객체에도 영향이 가겠고 이걸 방지하려고 깊은 복사를 하는거임
DeepCopyex03 복사 안하고 같은 객체에서 show 두번 해봐라 그래도 반환값이 매번 달라질걸? 애초에 show 메서드 호출할 때마다 새 배열 생성해서 리턴하는데 이게 어떻게 같을 수가 있겠냐 얕은 복사에서 문제가 생기는건 메서드 내에서 새로 생성하는 참조변수 때문에 생기는게 아니고 각 객체가 들고있는 필드변수때문에 발생하는거임
이 코드에서 문제 상황 보려면 show 메서드 안에서 생성하는 testarray1, testarray2, testarray3을 클래스의 필드로 바꿔서 매번 새로 생성하는게 아니라 필드를 반환하게 수정해봐
testarray1,2,3은 물론 생성자나 초기화 메서드 내에서 할당하게 바꾸고
여기 링크에 그림이 이해하기 좋게 되있네 봐보셈
https://naveen-metta.medium.com/unveiling-the-depths-shallow-copy-vs-deep-copy-in-java-ab7e483327bf
value가 실제 int array 값 전체를 가지고 있는게 아니고 실제 int array의 주소를 참조로 들고 있는거고 실제 int array 객체는 힙 공간에 있는거 근데 복사할때 주소값을 그냥 기계적으로 복사하니까 사실은 복사된 객체도 동일한 int array를 참조하고 있는 형태지 그리고 여기서 myObj1, myObj2도 사실은 힙 공간 안에 같이 있는거임
아이고 긴 답글 감사드립니다 ㅠㅠ 조언대로 testaray1,2,3 맴버필드로 빼고, 초기화는 생성자에서 하니 딱 해결되었습니다. 그래서 해결은 되었습니다. 감사드립니다.^^