const로 선언한 변수를 변경할 수 있는 경우와 그 이유

강원지·2023년 4월 25일
0

의문점

Javascript에서는 var, let, const의 변수 선언 키워드를 이용해 변수를 선언한다. var과 let의 경우는 실행 컨텍스트 내에서 값의 변경이 가능하지만 const의 경우에는 불가능하다.

그런데 다음과 같은 코드를 본 적이 있을 것이다.

const obj={}
obj.age=20

const arr=[]
arr[3]=3

const 키워드를 사용하면 변경이 불가능한 것 아닌가?

해결

위와 같은 코드 작성이 가능한 이유는 obj와 arr이 객체이기 때문이다.

변수 선언 키워드를 통해 변수에 할당하면 변수에는 값이 저장된다. 이 값이란 원시 타입에서는 실제 값, 객체 타입에서는 참조 값에 해당한다. 변경 불가능한 것은 변수가 아니라 '값'이다.

예시

const name='wonji'의 값을 변경한다고 해보겠다. 메모리에 저장된 값은 'wonji'이고 const는 재할당이 불가능하기 때문에 에러가 발생할 것이다.

const obj={}의 경우 메모리에 저장된 값은 obj의 값이 아니라 생성된 객체가 저장된 메모리 공간의 주소가 저장된다. 객체의 내용이 바뀌어도 객체의 메모리 공간의 주소는 변하지 않는다.
따라서 const 키워드를 사용하더라도 변수 자체를 재선언하지 않는 이상 그 내용은 변경 가능하다.

마무리

const는 재할당을 방지할 수 있으며 이를 명확하게 드러낼 수 있는 키워드이다. 우리 모두 좋은 코드를 작성하기 위해 사소한 것부터 신경쓰는 것이 좋겠다.

추가

변수 선언 키워드 정리

var : 변수 중복 선언 가능, 함수레벨 스코프, 변수 호이스팅(선언과 동시에 undefined로 초기화)

let : 중복 선언 금지, 블록레벨 스코프, 변수 호이스팅(선언과 초기화가 분리되어 진행, 초기화x시 참조 에러)

const : 중복 선언 금지, 블록레벨 스코프, 변수 호이스팅(선언과 동시에 초기화 필수), 재할당 금지

전역 변수의 문제점

  1. 암묵적 결합
    코드의 가독성이 나빠지고 상태를 변경할 수 있는 위험
  2. 긴 생명 주기
    메모리 리소스 오랜 시간 소비, 변수 상태 변경의 가능성, 변수 이름 중복⇒의도치 않은 재할당 발생
  3. 스코프 체인 상에서 종점에 존재
    검색속도가 느림
  4. 네임스페이스 오염
    다른 파일 내에 동일 이름으로 명명된다면 전역 변수나 전역 함수가 같은 스코프 내에 존재할 수 있음

0개의 댓글