참조 타입(Reference Types)과 const
객체(Object) 및 배열은 참조 타입입니다.
참조 타입 변수는 데이터 값 자체가 아니라 해당 객체 또는 배열이 실제 저장된 메모리 위치를 가리키는 주소를 참조해 저장합니다.
const로 참조 타입 변수를 선언할 경우, 변수에 저장된 메모리 주소 자체를 다른 주소로 재할당하는 것은 금지됩니다.
const configuration = { version: 1, enabled: true };
// configuration 변수가 다른 객체를 참조하도록 재할당 시도 -> 에러 발생
configuration = { version: 2, enabled: false }; // TypeError: Assignment to constant variable.
const dataArray = [10, 20, 30];
// dataArray 변수가 다른 배열을 참조하도록 재할당 시도 -> 에러 발생
dataArray = [40, 50]; // TypeError: Assignment to constant variable.
그러나 const 선언은 변수가 참조하는 객체 또는 배열의 내부 상태 또는 내용을 변경하는 것까지 제한하지는 않습니다. 즉, 변수가 가리키는 메모리 주소는 동일하게 유지하면서, 그 주소에 위치한 객체의 속성(property)이나 배열의 요소(element)는 수정될 수 있습니다. 이는 객체와 배열 자체가 가변 데이터 구조이기 때문입니다.
const userProfile = { id: 101, status: "active" };
// 객체의 속성 값 변경 (허용됨 - userProfile 변수의 참조는 변경되지 않음)
userProfile.status = "inactive";
console.log(userProfile); // 출력: { id: 101, status: 'inactive' }
const settings = ["dark", "notifications"];
// 배열에 요소 추가 (허용됨 - settings 변수의 참조는 변경되지 않음)
settings.push("sync");
console.log(settings); // 출력: [ 'dark', 'notifications', 'sync' ]
// 배열의 특정 인덱스 요소 값 변경 (허용됨)
settings[0] = "light";
console.log(settings); // 출력: [ 'light', 'notifications', 'sync' ]
결론
const 키워드는 변수의 재할당을 방지하여 변수가 항상 동일한 원시 값 또는 동일한 메모리 참조를 유지하도록 강제합니다.
하지만 const가 참조 타입(객체, 배열) 변수와 함께 사용될 때, 이는 변수가 저장하는 참조의 불변성만을 보장할 뿐,
그 참조가 가리키는 객체나 배열 자체의 내용물에 대한 불변성까지 보장하지는 않습니다.
참조 대상의 내부 상태 변경은 const의 제약 범위에 해당하지 않습니다.
객체나 배열의 내용을 변경 불가능하게 만들려면 Object.freeze()와 같은 별도의 방법을 사용해야 합니다.
'JavaScript' 카테고리의 다른 글
단축 속성명 (0) | 2025.04.28 |
---|---|
객체 리터럴 (0) | 2025.04.27 |
for .. of 반복문 (1) | 2025.04.13 |
배열의 범위 기반 for문, forEach() (1) | 2025.04.13 |
map을 이용한 배열의 각 요소 접근 (0) | 2025.04.13 |