컴퓨터는 메모리에 데이터를 저장하고 CPU 를 사용해 연산합니다. CPU 는 필요한 데이터를 메모리에서 가져와 연산하고 그 결과를 다시 메모리에 저장하는 방식으로 동작하죠. 이 때 메모리는 데이터를 저장할 수 있는 수많은 메모리 셀의 집합으로 이루어집니다. 그리고 각각의 셀은 고유한 주소 값을 가지게 됩니다.
자바스크립트는 개발자가 직접적으로 메모리를 제어하는 것을 허용하지 않습니다. 주소 값에 직접적으로 접근하는 것은 치명적인 오류를 발생시킬 수도 있기 때문입니다. 게다가 메모리의 주소 값이라고 하는 것은 프로그램이 동작할 때마다 바뀔 수 있는 값이기 때문에 이를 직접적으로 사용하는 것은 좋은 방법이 아닙니다.
자바스크립트는 변수를 사용해 메모리 공간에 접근할 수 있게 합니다. 변수를 선언한다는 것은 특정한 메모리 공간을 확보하는 것을 말하며, 이 때 변수가 바로 메모리 공간의 주소를 나타내는 상징적인 의미가 되기 때문입니다. (조금 더 정확히 말하면 식별자가 메모리 주소와 매핑되는 것이고 변수는 식별자에 포함된다고 할 수 있습니다.)
따라서 변수는 프로그래머가 이해하기 쉬운 언어로 정리된 메모리 공간의 주소라고 할 수 있습니다. 어떤 데이터 값을 할당하게 되면 메모리 공간의 주소에 그 값이 저장되는 것이죠. 그리고 데이터의 타입이 원시 타입이냐 객체 타입이냐에 따라서 그 동작 방법이 달라집니다.
let primitiveType = 20; // primitiveType 가 가리키는 메모리 공간에 값 자체를 저장
let objectType = { // objectType 가 가리키는 메모리 공간에 객체의 주소 값을 저장
name : "object"
};
let kim = {
age : 20
};
let lee = {
age : 20
};
console.log(kim === lee); // false
console.log(kim.age === lee.age); // true
primitiveType
변수에 20 이라는 원시 타입의 숫자 값을 할당했습니다. 이 때 primitiveType
가 가리키는 메모리 공간에 저장되는 것은 20 이라는 값 그 자체입니다.
objectType
변수에 객체를 할당할 경우에는 객체가 그대로 저장되지 않습니다. objectType
가 가리키는 메모리 공간에 저장되는 것은 또 다른 메모리 공간의 주소입니다. 이 주소로 가야 비로소 객체의 정보에 접근할 수 있게 되는 것이죠.
kim
이라는 변수와 lee
라는 변수가 가진 객체의 모양이 완전히 일치함에도 불구하고 두 객체를 비교했을 때 false 라는 값이 나타나는 이유가 여기에 있습니다. 두 객체는 서로 다른 주소를 가리키고 있기 때문입니다. 객체의 모양이 같다 해도 두 객체는 전혀 별개의 주소에 저장되어 있습니다.
그러나 kim.age 와 lee.age 라는 표현식은 둘 다 20 이라는 숫자 값으로 나타납니다. 따라서 이 둘을 비교했을 때는 true 라는 값이 나타나게 됩니다.
개인적으로 무언가를 공부하는 과정은 계단을 올라가는 것과 비슷하다고 생각합니다. 어느 순간 갑자기 이해의 폭이 넓어지는 경험을 종종 하기 때문입니다.
모던 자바스크립트 Deep Dive
를 읽어나가던 중, 11 장을 읽고 나니 변수를 다루던 4 장의 내용이 조금 더 구체적으로 이해되기 시작했습니다. 그래서 오늘의 블로깅을 변수와 메모리 공간에 대한 내용으로 정리해봤습니다.
오늘 블로깅한 모든 내용은 모던 자바스크립트 Deep Dive
4장, 11장을 기반으로 하고 있습니다. 개인적으로 그동안 부트캠프를 통해 배운 내용을 복습하기에 적합한 책이라고 생각합니다. 꼭 한 번 읽어보시기를 추천합니다.