JS const 에 대한 고찰
html, css 클론 코딩이후 vanila js 에 대해 공부를 시작하기로 함. 강의 영상 댓글에서 좋은 질문과 답변이 있어서 나도 찾은 보고 간단히 정리.
const type 으로 array 를 정의했는데, push 같은 function 으로 어떻게 값이 추가될 수 있는가?(const 는 불변이라고 했는데!)
그 이유는, const 는 변수가 정의될 때 부여받은 메모리 주소를 변하지 않게 만드는 것이라고 한다. 쉽게 이야기하자면, c에서 나오는 pointer 가 가리키고 있는 메모리 주소값을 불변 상태로!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const mon = "mon";
const tue = "tue";
const wed = "wed";
const thu = "thu";
const fri = "fri";
const sat = "sat";
const sun = "sun"; // 이 값이 저장된 위치(메모리 주소)를 a 라고 가정.
sun = "123";
// 여기에서는 sun 에 대해 "123" 을
// 새로운 메모리 주소인 b 에 저장하려고 해 오류가 발생한다!
const daysOfWeek = [mon, tue, wed, thu, fri, sat];
// 배열에 데이터 추가하기
daysOfWeek.push(sun);
위의 코드를 보면, 7개의 const 변수가 존재하고 그 중 sun 변수에 새로운 값을 정의하려고 함. ==> 이 상황에서는 이미 “sun” 이라는 string 을 저장하고 있는 sun 에 “123” 이라는 새로운 string 을 저장하는 메모리 주소값으로 바꾸려고 시도하기 때문에 오류가 생긴다는 것!
이와 별개로, js 에서 변수의 메모리 할당 과정도 간단히 적어보면 변수의 유형을 2가지로 구분할 수 있다.
- 원시형 -> string, number 등 간단한 변수. stack 영역에 실제 정의한 값이 저장됨.
- 참조형 -> 배열이나, 객체. stack 영역에 heap 영역의 주소값이 저장됨.
원시형은 로컬 변수를 저장하는 영역인 stack 에서만 할당이 이루어진다. 참조형은 참조 형태로, 변수 자체는 heap 에 저장된다. 하지만 stack 영역도 사용하는데, stack 에서 할당 받은 주소에는 heap 공간에서 할당받은 메모리 주소를 가지고 있는 형태다. -> const 는 stack 에 저장된 값이 바뀔 수 없다는 것!
그렇다면, 배열은?? → 배열 역시 heap 공간을 할당받으며, stack 에는 heap의 주소값을 갖는다. 이때, 첫 번째 요소의 주소 값을 갖는다. 또한 js 는 가변 크기 배열을 지원하기 때문에, push 등의 메소드를 값이 추가되어도 stack 공간에 저장된 주소 값이 변하지 않기 때문에 const 배열을 선언해도 요소 추가가 된다!!!
또한, js 는 c언어의 배열과 달리 가변크기임. 또한, 메모리 공간을 연속적으로만 할당하지 않음.
1
2
3
const arr = [1, 2, 3];
arr[9] = 10; // 이것은 가변크기이기 때문에 가능한 것.
// 이렇게 하면, [3] - [8] 범위의 공간에는 undefined 로 저장된다.