[Javascript] 타입 총정리 ③ | 원시 타입과 객체 타입의 결정적 차이 (수정 예정)

Re_Go·2023년 12월 5일
0

Javascript

목록 보기
5/44
post-thumbnail

1. 원시 타입의 메모리 변화와 값 복사

자바스크립트의 경우 변수가 생성(초기화)이 되고 콜 스택에 원시 타입의 데이터가 고정된 크기로 콜 스택(call stack)에 생성이 된 후 그 값을 변수가 직접적으로 참조하게 되는데, 이 경우 한 번 생성된 원시 타입의 데이터는 변경이 되지 않습니다.

무슨 말이냐면, 어떠한 변수의 값이 변할 때(재할당 할 때) 기존에 그 변수가 가지고 있던 값이 없어지고 그 자리를 다른 값이 대체하는 과정이 아닌, 기존의 값에 대한 참조를 끊어내고 새로운 값을 콜 스택에 새로 생성하여 해당 값을 변수가 새로 참조하는 과정이 일어난다는 것인데요.

즉, 기존의 값은 다른 변수들에 의해 참조가 이어지는 한 가비지 컬렉터(garbage collector)에 의해 삭제 되기 전까지 그 형태를 유지하고 있다는 것, 이것을 바로 '불변성' 이라고 하는 겁니다.

그리고 이를 두고 pass by value(값에 의한 전달) 의 속성을 가진다고도 하는 것이죠.

(수정 예정)

2. 객체 타입의 메모리 변화와 값 복사

객체 타입의 데이터의 경우에는 콜 스택(call stack)에 변수가 생성이 된 후 객체 타입의 데이터를 그 공간에서 참조하는 형태가 아닌, 힙(heap)이라는 공간에 가변적 크기의 객체 데이터가 생성된 상태에서 그 주소를 참조하는 값을 가지고 있는 상태로 해당 할당이 이루어지게 됩니다. 즉 직접 데이터를 소유하기보다 그 데이터가 들어있는 다른 메모리 공간의 주소의 참조를 가지고 있는 상태인 것이죠.

또한 이러한 객체 타입의 데이터는 기존의 값을 삭제하고 다른 값으로 대체 할 수 있는 등의 변화를 줄 수 있기 때문에, 이를 두고 불변성의 반댓말인 '가변성' 이라고도 부릅니다.

그래서 원시 타입과는 다르게 일반적인 대입연산자(=) 를 이용한 객체 복사의 경우 원시 타입처럼 값이 별도의 메모리에 복사되는 것이 아니라, 주소를 참조하고 있는 값을 복사하는 방식이 되어 어느 한 쪽에서 데이터를 수정하면 그 데이터의 주소를 참조하고 있는 다른 변수들의 값까지 같이 변해있는 것을 확인할 수 있게 됩니다. 그리고 이것을 참조에 의한 전달(pass by reference) 라고도 부르는 것이죠.

만약 사용자의 의도대로 값을 완전히 복사하고 싶은 경우 스프레드 연산자를 이용한 얕은 복사를 이용하거나, JSON 빌트인 객체의 일부 메서드(stringify, parse)를 이용하거나 lodash 라이브러리를 이용해 깊은 복사를 구현하는 방법을 사용하면 됩니다.

(수정 예정)

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글