개발자
안녕하세요. 혼자서 독학 하던 중에 내용이 이해가 되지 않는 부분이 있어서 질문 드립니다. 모던 자바스크립트 Deep Dive 책에서 변수 선언 및 값의 할당 부분을 공부하고 있는데 책의 내용과 제가 검색해본 내용에 혼동이 생기는 부분이 있습니다. 책에서는 “ 변수에 값을 할당할 때는 이전 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 할당 값 80을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값 80을 저장한다는 점에 주의하자 ” 라는 구문과 함께 아래 그림 내용과 다음과 같은 코드가 설명으로 나와 있습니다. 그런데 제가 더 찾아본 내용으로는 primitive type위 경우에는 값이 변경되어도 동일한 메모리 주소를 같는 것으로 알고 있는데 아래 그림은 메모리 주소가 변경되는 것 처럼 표현이 되어있습니다. 제가 혹시 놓치고 있는 부분이 있는 것일까요??
1console.log(score); // undefined
2
3var socre = 80; // 변수 선언과 값의 할당
4
5console.log(score); // 80
답변 2
인기 답변
안녕하세요, primitive type인 경우, - 같은 type이고 - 메모리크기가 변경되지 않을 때만, 변수가 가리키는 메모리가 유지되는 것이 맞을 것입니다. primitive type에도 number, string, boolean, null, undefined 등 type이 여러가지가 있는데요. 각 type을 표현하는 데, 동일한 메모리 양으로 표현하는 것이 불가능합니다. 예를 들어 number를 표현하는데 64bit 지만, boolean에 이정도의 메모리를 할당하는 것은 낭비겠죠. 마찬가지로 string은 실제 값이 들어와봐야 어느정도의 메모리 크기를 가질 지 알 수 있습니다. 따라서 undefined가 아직 값이 할당되지 않았다는 것을 의미한다고 생각하면, 어떤 크기의 메모리를 가지게 될지 미리 결정할 수가 없습니다. 하지만, undefined라는 것은 나타내야 되겠기에, 메모리상에 이걸 표시하는 무언가를 특정한 크기의 메모리를 할당해서 가리키게 할 겁니다. 그러다가 해당 변수에 값이 들어오면, 그 값을 가진 메모리가 바로 그 변수가 가리키는 값이 될 겁니다. 결과적으로, 우리가 값타입이라고 알고 있는 primitive type도 결국은 이런 이유로 reference 및 pointer처럼 사용될 수 도 있습니다. (물론 처음부터 고정 메모리를 필요로 하는 type의 값을 할당하고, 그 type 으로만 사용한다면, value type처럼 쓰일 수 있을 겁니다.)
권건형
작성자
독학 웹 • 2023년 07월 16일
좋은 답변 감사드립니다 :)
모던 자바스크립트 Deep Dive에서 설명되는 내용과 검색해 본 내용이 혼동되는 이유는 개념적인 차이 때문입니다. 책에서 설명하는 것은 변수 선언과 값의 할당이 동시에 이루어질 때의 동작을 설명하고 있습니다. 코드에서 `var score = 80;`과 같이 변수 선언과 값의 할당이 동시에 이루어지면, JavaScript 엔진은 새로운 메모리 공간을 확보하고 해당 변수에 할당 값(여기서는 80)을 저장합니다. 이 때, 이전 값(undefined)이 저장되어 있던 메모리 공간은 지워지게 됩니다. 하지만 일반적으로 변수에 값이 할당되는 경우, 기존에 할당되어 있던 메모리 공간에 새로운 값이 덮어씌워지게 됩니다. 이는 기본 데이터 타입(primitive type)에 해당하는 경우입니다. 즉, 숫자, 문자열, 불리언 등의 데이터는 메모리 공간을 변경하지 않고 해당 변수에 직접 값을 덮어씌우게 됩니다. 따라서, 개념적으로는 값을 변경할 때 기존 메모리 공간을 사용하는 것이 맞지만, 변수 선언과 값의 할당이 동시에 이루어지는 경우에는 새로운 메모리 공간을 확보하고 값을 저장하게 됩니다. 이 점을 구분하여 이해하시면 됩니다.
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!