ArrayCopy
ArrayCopy를 배우면서 Stack, Heap에 관련된 메모리 영역을 처음으로 접하게 되었었는데
그와 같이 배웠던 것이 주소값과 관련된 내용들이었다.
깊은 복사와 얕은 복사를 다시 정리하지 않으면 배열에 대해서 응용을 잘 못할 것 같아 지금 다시 정리해보겠다!
- Stack 영역과 Heap 영역
최초에 배열이 생성되면 Stack 영역에 배열의 주소값이 할당되고 Heap 영역에는 배열의 인덱스값이 저장된다.
Stack영역에 주소값이 저장돼서 Heap영역에 인덱스를 참조하는 방식이다.
이 부분이 배열의 복사를 이해할 때 가장 중요한 부분이라 생각하기 때문에 항상 메모리 영역에 대한 이해가 필요할 것 같다.
메모리에 관련한 Remind 게시물도 조만간 정리해서 올려야겠다.
1. 얕은 복사
얕은 복사는 원본 배열을 그대로 복사하는 것을 말한다.
쉽게 말해서 주소값까지도 복사를 하는 것이다
최초에 origin 배열을 선언한 후 copy 배열 생성 후 그대로 origin을 대입하였다.
아까 살펴 본 메모리 영역에서 설명을 하자면
0x1234라는 주소값을 origin과 copy 배열 둘 다 참고하는 그림이다.
이를 확인해보면
hashcode() 메소드로 각각의 배열의 주소값을 확인해본 결과 같은 주소값을 가진 것을 확인할 수 있었다.
이것이 어떤 의미를 갖느냐?
copy 배열 선언 후 copy의 2번 인덱스에 값을 바꿔주었다
그리고 배열을 순차적으로 출력을 해보면
원본 배열의 값까지도 바뀐것을 확인할 수 있다.
같은 주소값을 참조하고 있어서 Heap영역에 참조되는 인덱스도 바뀌기 때문에 결론적으로 원본 배열에도 영향을 미치는 것을 확인할 수 있다.
얕은 복사 결론!
같은 주소값을 참조하는 배열이므로 복사본의 배열의 어느 한 인덱스 값을 바꾸면 원본 배열에도 영향을 미친다!
'Dev > Java' 카테고리의 다른 글
05-1. 다양한 함수(Math.random) (1) | 2023.07.25 |
---|---|
04-2.ArrayCopy(깊은 복사) (0) | 2023.07.17 |
03. continue (0) | 2023.07.12 |
02.while / do-while (0) | 2023.07.12 |
01.Scanner (0) | 2023.07.09 |