2023년 06월 13일
과거 slice와 같은 메소드가 1차원 배열에서는 깊은 복사, 2차원 배열에서는 얕은 복사처럼 수행되는 이유에 대해서도 알아봤었다. 하지만 처음 학습 당시 뭔가 시원하게 해결되었다라는 느낌이 들지 않았다. 그래서 다시 한번 예시를 활용하여 복습해보고자 한다.
var originalArray = 1;
var copiedArray = originalArray;
originalArray = 100;
console.log(originalArray); // 100
console.log(copiedArray); // 1
위 예시 코드에서 원시 타입 값을 식별자를 활용하여 복사하였다. 이 때 메모리 공간에서는 아래와 같이 동작하게 된다.
originalArray
식별자가 생성되고 콜스택에 새로운 메모리 영역을 생성하여 생성된 1
(0x0000000) 의 주소를 참조한다.originalArray
를 copiedArray
에 복사할 때 원시 타입 1
(0x0000000)은 깊은 복사를 수행하기 때문에 콜스택에 새로운 메모리 공간을 할당한 뒤 copiedArray
식별자는 그 주소(0x0000001)를 참조학게 된다.originalArray = 100;
을 통해 값이 업데이트 되는데 이 때 메모리 공간에는 100
(0x0000002)의 값을 가진 새로운 메모리 공간을 할당하게 되고 originalArray
식별자가 가리키는 참조 주소가 해당 주소(0x0000002)로 변경된다. 그 후 기존에 참조하던 1
(0x0000000)은 아무 식별자도 참조하고 있지 않으므로 가비지 컬렉터에 의해 제거 된다.var originalArray = 1;
var copiedArray = 1;
originalArray = 100;
console.log(originalArray); // 100
console.log(copiedArray); // 1
1-1과는 다르게 동일한 값을 다시 선언하는 경우에는 어떻게 동작할까? 우선 콘솔에 찍히는 값은 1-1과 동일하다. 하지만 메모리 공간에서의 동작은 차이가 있다.
originalArray
식별자가 생성되고 콜스택에 새로운 메모리 영역을 생성하여 생성된 1
(0x0000000) 의 주소를 참조한다.copiedArray
식별자가 생성되고 값을 할당하기 위해 주소를 참조하려고 할 때 참조해야하는 값 1
은 이미 메모리 공간에 존재하므로 새로운 메모리 공간을 할당하지 않고 이미 존재하는 1
(0x0000000)의 주소를 참조한다.