const로 선언한 배열·객체에 요소를 추가할 수 있는 이유
면접에서 “배열, 객체를 const로 선언했는데 요소나 속성을 추가할 수 있는 이유를 설명해 주세요.”라는 질문이 자주 나옵니다. const가 무엇을 막는지부터 정리해 보겠습니다.
const가 막는 것은 “재할당”
JavaScript에서 const로 선언된 배열과 객체에 요소나 속성을 추가할 수 있는 이유는, const가 변수의 재할당을 제한하는 것이지 배열·객체의 내부 구조 변경까지 막는 것은 아니기 때문입니다.
const는 변수에 할당된 값의 재할당을 막습니다. 즉, const로 선언된 변수에 다른 값을 할당하려고 하면 에러가 발생합니다.
const x = 5;
x = 10; // Error: Assignment to constant variable.
배열·객체는 변경 가능한(mutable) 데이터 구조
배열과 객체는 변경 가능한(mutable) 데이터 구조입니다. 즉, 배열과 객체의 내용을 수정하거나 속성을 추가/삭제하는 것은 내부 구조를 변경하는 것이지 변수의 재할당은 아닙니다.
const로 선언된 배열이나 객체는 여전히 동일한 배열·객체를 참조하며, 그 참조(메모리 주소)는 변경되지 않습니다. 따라서 요소나 속성을 추가하는 것은 내부 상태를 바꾸는 것일 뿐, 변수가 가리키는 참조는 그대로입니다.
const myArray = [1, 2, 3];
myArray.push(4); // 배열에 요소 추가
console.log(myArray); // [1, 2, 3, 4]
const myObject = { name: 'John' };
myObject.age = 30; // 객체에 속성 추가
console.log(myObject); // { name: 'John', age: 30 }
한 줄 요약
const는 변수가 가리키는 참조의 재할당만 막을 뿐, 그 참조가 가리키는 배열·객체의 내부 값(요소·속성)은 변경할 수 있습니다. 그래서 const 배열에 push하거나 객체에 속성을 추가하는 것은 가능하지만, 변수에 새 값을 재할당하는 것은 불가능합니다.