해결된 질문
작성
·
14
0
안녕하세요 원시타입과 객체타입 강의를 보다가 궁금한점이 생겨 질문을 드립니다.
let p1 = 1;
let p2 = p1;
p2 = 2;
이렇게 1에서 2로 재할당을 하면 메모리상에는 원래 1이 있었는데 새로운 메모리에 2가 추가가 되면서 해당 공간을 가리키는데 메모리 공간에 저장되어 있던 1은 수정되지 않는다...라고 이해하고 있습니다. 그럼 여기서 1은 수정만 되지 않을 뿐 없어지지 않고 그대로 1이 저장이 되어있는건가요?
그리고 객체타입에서는 값을 변경하면 원본이 바로 변경되므로 안전하게 ... 스프레드로 값을 복사해서 사용한다라는 설명이 맞나요?
답변 2
0
안녕하세요 이정환입니다.
네 잘 이해하셨습니다. 원시타입의 값은 메모리상에서 직접 수정되지 않습니다. 반면 객체타입의 경우 메모리상에서 값이 직접 수정됩니다 이 역시 말씀하신 내용이 맞습니다.
따라서 해당 객체를 참조하고 있는 여러 변수의 값이 동시에 변경될 수 있어 안전한 객체 복사를 위해서는 깊은 복사를 사용하셔야 합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 부드러운 족제비님.
자바스크립트에서 원시타입과 객체타입의 메모리 관리 방식에 대한 질문을 주셨네요. 먼저 원시타입에 대해 설명드리겠습니다.
원시타입의 경우, 변수에 값을 할당할 때마다 값 자체가 복사됩니다. 즉, p1
과 p2
는 각각의 메모리 공간에 독립적으로 값을 가지고 있습니다. 따라서 p2 = 2
로 재할당하면 p1
이 가리키는 값 1
은 여전히 메모리에 남아 있습니다. 다만, 더 이상 p2
는 그 값을 참조하지 않습니다. 이 때, 가비지 컬렉터가 1
을 참조하는 변수가 없다는 것을 확인하면 해당 메모리를 회수할 수 있습니다.
반면, 객체타입은 변수에 참조값(메모리 주소)를 저장하며, 이 때문에 동일한 객체를 여러 변수가 참조할 수 있습니다. 하나의 변수에서 객체 내부의 값을 변경하면 해당 객체를 참조하는 다른 변수들에서도 변경사항이 반영됩니다.
객체를 얕은 복사으로 새로운 메모리 공간에 독립적으로 저장하고 싶다면 스프레드 연산자(…)를 사용합니다. 이는 객체의 첫 번째 레벨만 독립적으로 복사하며, 중첩 객체들은 여전히 참조를 유지합니다.
이와 관련된 문의는 원시 타입 데이터 할당에 관한 질문에서도 다루어졌습니다. 여기서 강사님께서 원시 타입이 “값에 의한 복사”로 처리된다는 점을 설명하고 계십니다.
얕은 복사와 깊은 복사에 대한 질문에서는 얕은 복사와 깊은 복사에 대한 일반적인 혼란과 정의에 대해 다루고 있으며, 스프레드 연산자의 사용에 대한 추가적인 논의로 도움을 받을 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.