[JS] const로 선언해도 값을 바꿀 수 있다?

안녕하세요.

제가 예전에 한 회사 면접을 볼 때 "const로도 값을 변경할 수 있는데 어떤 경우인지 아십니까?"라는 질문을 받았었는데요, 메모리 구조에 대한 지식이 부족했어서 힙? 스택? 어쩌고저쩌고.. 어버버 거렸던 기억이 문뜩 납니다..

(아시는 것 같은데 왜 대답을 못 하시죠? 더 생각하고 대답해보세요! 라고 하셨는데 저는 정말 몰랐다구요ㅠㅠㅜㅜㅜ...)

무튼..! 그래서 오늘은 const로 선언을 했을 때 어떤 경우에 값을 바꿀 수 있는지 정리해보려고 합니다.

 

 

const?

  • 변수에 재할당을 허용하지 않는 상수를 선언할 때 사용
  • 즉, const로 선언한 변수는 한 번 할당된 값이 고정되고 다른 값을 다시 할당하려고 하면 에러가 발생
const num = 10;
num = 20; // Error!

위에서 num이라는 변수는 10으로 고정되며, 다른 값으로 변경하려고 하면 에러가 발생함!

 

 

 

const와 데이터 유형과 동작

원시형 데이터

  • 숫자, 문자열, 불리언 등 하나의 값만 가지는 데이터 유형. const로 선언 시 값 자체가 고정되어 값을 다른 값으로 변경할 수 없음
const greeting = "Hello!";
greeting = "Hi!"; // Error!

 

 

참조형 데이터

객체(Object), 배열(Array) 등 내부 요소가 변할 수 있는 데이터 유형. const로 선언하더라도 참조 주소는 고정되지만 데이터 내부 값은 변경이 가능

const cat = { name: "뭉이", age: 9 };

// 객체 내부의 속성 변경은 가능
cat.age = 10;
console.log(cat); // { name: "뭉이", age: 10 };

// 그러나 'cat' 전체를 다른 객체로 변경은 불가능
cat = { name: "조이", age: 9 }; // Error!

위에서 cat 객체는 const로 선언되어 객체 자체를 다른 것으로 바꾸는 것은 불가능하지만 객체 내부 속성(age) 값은 수정할 수 있음. 이런 차이는 const가 변수의 참조 주소값을 고정*하는 역할을 하기 때문!

참조형 데이터의 경우 주소는 고정되지만 그 내부 구조는 고정되지 않기 때문에 const로 선언해도 내부 속성을 변경할 수 있는 것임

 

* 참조 주소값을 고정?

변수가 가리키는 대상이 바뀌지 않는다는 뜻. const로 선언된 변수가 객체나 배열을 가리킬 때 그 객체나 배열 자체를 다른 것으로 바꾸는 건 불가능하지만 그 안에 있는 값는 바꿀 수 있다는 의미