Dev/Java

04-1.ArrayCopy (얕은 복사)

YoonYeoJin 2023. 7. 17. 01:31

ArrayCopy

ArrayCopy를 배우면서 Stack, Heap에 관련된 메모리 영역을 처음으로 접하게 되었었는데

그와 같이 배웠던 것이 주소값과 관련된 내용들이었다.

 

깊은 복사와 얕은 복사를 다시 정리하지 않으면 배열에 대해서 응용을 잘 못할 것 같아 지금 다시 정리해보겠다!

 

- Stack 영역과 Heap 영역

최초에 배열이 생성되면 Stack 영역에 배열의 주소값이 할당되고 Heap 영역에는 배열의 인덱스값이 저장된다.

Stack영역에 주소값이 저장돼서 Heap영역에 인덱스를 참조하는 방식이다.

 

이 부분이 배열의 복사를 이해할 때 가장 중요한 부분이라 생각하기 때문에 항상 메모리 영역에 대한 이해가 필요할 것 같다.

메모리에 관련한 Remind 게시물도 조만간 정리해서 올려야겠다.

 

1. 얕은 복사

얕은 복사는 원본 배열을 그대로 복사하는 것을 말한다.

쉽게 말해서 주소값까지도 복사를 하는 것이다

 

최초에 origin 배열을 선언한 후 copy 배열 생성 후 그대로 origin을 대입하였다.

아까 살펴 본 메모리 영역에서 설명을 하자면

0x1234라는 주소값을 origin과 copy 배열 둘 다 참고하는 그림이다.

 

이를 확인해보면 

hashcode() 메소드로 각각의 배열의 주소값을 확인해본 결과 같은 주소값을 가진 것을 확인할 수 있었다.

 

이것이 어떤 의미를 갖느냐?

copy 배열 선언 후 copy의 2번 인덱스에 값을 바꿔주었다

그리고 배열을 순차적으로 출력을 해보면

 

원본 배열의 값까지도 바뀐것을 확인할 수 있다.

같은 주소값을 참조하고 있어서 Heap영역에 참조되는 인덱스도 바뀌기 때문에 결론적으로 원본 배열에도 영향을 미치는 것을 확인할 수 있다.

 

얕은 복사 결론!

같은 주소값을 참조하는 배열이므로 복사본의 배열의 어느 한 인덱스 값을 바꾸면 원본 배열에도 영향을 미친다!