
변수 할당에 있어서 메모리가 무슨 연관이 있길래?
컴퓨터의 필수 3가지 요소를 추리라고 하면 당연 cpu, 하드디스크, 메모리일 것이다.
게중에서 변수 할당시 메모리를 고려해야 하는 이유는 컴퓨터에서 무언가를 처리할때 메모리상에 데이터를 보관하고 읽고 쓰기 때문이다.
메모리는 메모리 셀들의 연속으로 이루어져있고 각 메모리 셀들은 1byte 즉, 8bit으로 구성되어 있다. 참고로 0 또는 1을 할당할때 쓰이는 메모리는 1bit이다.
그래서 변수는 메모리에 어떻게 할당되는데?
변수를 한마디로 정의하면 이름이 주어진 기억 장소 이다.
여기서 기억 장소가 바로 메모리이고, 변수는 메모리 주소를 가리키는 식별자이다.
가령 다음과 같이 변수를 선언했다고 해보자.
let a=0;
let a=2;
let b;
변수 유형은 또 왜 나눌까?
자바스크립트 변수는 원시타입과 객체타입으로 나뉘는데 각 타입에 해당하는 경우는 다음과 같다. 대체로 원시타입은 단일데이터가 객체타입은 복합데이터가 그에 해당한다.
| 원시타입 | 객체타입 |
|---|---|
| number | 함수 등 |
| string | 원시타입에 해당하는 |
| boolean | 데이터를 제외한 |
| null | 모든 데이터가 |
| undefineds | 객체타입에 해당함 |
이유는 다음 그림을 보면 이해가 가능하다.
객체 타입은 원시타입과 달리 메모리가 동적으로 할당된다. (이는 heap에 할당됨)
식별자 a가 가리키는 메모리 주소에는 값이 저장되어 있지만, 식별자 apple이 가리키는 메모리 주소안에는 또 다른 메모리 주소가 저장되어 있다.
즉, 메모리 주소 할당 방식이 달라서 각 식별자의 데이터 타입을 구분해야 한다.

데이터 타입에 따라 메모리 저장 방식이 다른데 이로 인한 직접적인(?) 차이는 무엇일까?
let a=0
b=a;
b=1;
console.log(a) //0
console.log(b) //1
let apple={
name:'apple',
price:1500,
}
let banana=apple;
banana.name='banana';
console.log(apple.name); //banana
console.log(banana.name); //banana
원시타입은 값 자체를 가리키기 때문에(원시 타입이 가리키는 메모리 주소에 값이 저장되어 있기 때문에) 보다시피 값을 재할당 할 경우 b에 재할당 된 값이 저장된다. 반면, 객체타입은 참조(메모리 셀에 메모리 주소를 저장)하고 있기 때문에 apple의 값도 바뀌어버린다. 쉽게 말하면 banana.name='banana' 코드가 레퍼런스 자체를 바꿔버린 셈이다.
무슨 말이냐면 무심코 선언한 변수가, 꼭 변수가 아니라도 메모리를 신경쓰지 않고 작성한 코드가 불필요하게 많은 메모리 공간을 차지해버리면 처리속도가 느려지거나 최악의 경우 내 컴퓨터 메모리 용량보다 애플리케이션 용량이 커서 애플리케이션을 실행할 수 없는 문제가 발생한다. 무분별하게 변수를 할당하거나 메모리를 잡아먹지 말자는 이야기다.
또 바뀌면 안되는 변수는 const로 선언하자. 사실 웬만하면 const가 좋다.
오해하지 말아야 할건 const 변수를 선언하면 재할당이 불가능한거지 값 변경은 가능하다.
const로 선언한 변수가 가리키는 메모리 셀에 다른 메모리 주소를 할당할 수는 없지만(재할당) 해당 메모리 주소에 있는 값 자체는 변경이 가능하다는 뜻이다.
const apple={
name:'apple',
price:1500,
}
console.log(apple); //{ name: 'apple', price: 1500 }
const banana=apple;
banana.name='banana';
console.log(apple); //{ name: 'banana', price: 1500 }