자바스크립트 교재 · 3편 / 26편

변수와 상수 — let·const·var

세 가지가 어떻게 다른지, 그리고 왜 const 부터 손이 가야 하는지.

입문읽는 시간 6분2026-05-16
let·const·var 세 박스가 스코프와 호이스팅의 차이를 도식으로 보여주는 그림

JS 에서 값을 담는 그릇은 세 가지입니다 — let·const·var. 모두 같은 일을 하는 것 같지만 스코프(범위), 호이스팅, 재할당 가능 여부에서 모두 다릅니다. 결론부터: const 가 기본, 바꿔야 하면 let, var 는 쓰지 않는다. 그 이유를 차근차근 봅니다.

한 줄 차이 — 한 표로

키워드재할당스코프호이스팅중복 선언
const블록 { }TDZ (사용 불가)
let블록 { }TDZ (사용 불가)
var함수undefined 로 끌어올림✅ (가능)

const — 한 번 정한 값은 안 바꾸겠다

const PI = 3.14;
PI = 3.15;        // ❌ TypeError: Assignment to constant variable.

const user = { name: "준성" };
user.name = "준석";   // ✅ 이건 OK
user = { name: "X" }; // ❌ 재할당은 안 됨

"const 는 값이 바뀌지 않는다" 가 아니다. 정확히는 "바인딩(변수가 가리키는 곳)이 바뀌지 않는다". 그래서 객체의 속성은 바꿀 수 있습니다 — 가리키는 객체 자체는 같으니까요. 객체 통째로 막고 싶으면 Object.freeze() 를 씁니다.

let — 바꿀 변수에만

let count = 0;
count = count + 1;   // ✅
count += 1;          // ✅ (같음)

// 반복문에서
for (let i = 0; i < 3; i++) {
  console.log(i);    // 0, 1, 2
}
console.log(i);      // ❌ i is not defined — for 블록 밖이라 못 봄

let 은 블록 스코프입니다. { } 안에서 선언하면 그 안에서만 살아 있고, 밖으로 새지 않습니다. 이게 "현대 JS" 의 정상적인 모습입니다.

var — 왜 쓰지 말아야 하나

// 1. 함수 스코프 — 블록을 무시
function demo() {
  if (true) {
    var x = 10;
  }
  console.log(x);    // 10 ← if 밖에서도 살아 있음!
}

// 2. 호이스팅이 undefined 로 끌어올림
console.log(y);      // undefined ← 에러도 안 남, 더 위험
var y = 5;

// 3. 같은 이름으로 중복 선언이 가능
var name = "준성";
var name = "준석";   // ✅ 통과 — 오타로 멀쩡한 변수를 덮어쓰기 쉬움

세 가지 모두 "의도 안 한 버그를 키우는" 방향입니다. const/let 은 이 세 가지를 모두 막아줍니다. 그래서 2015년(ES6) 이후 var 는 사실상 폐기 — 새 코드에 쓸 이유가 없습니다.

TDZ — let/const 의 "사용 금지 구역"

let·const 도 호이스팅은 됩니다. 다만 선언 줄 전까지는 "건드리면 죽음" 구역입니다. 이걸 TDZ(Temporal Dead Zone) 라고 부릅니다.

console.log(a);   // ❌ ReferenceError: Cannot access 'a' before initialization
let a = 5;

// vs var
console.log(b);   // undefined (에러 X)
var b = 5;

TDZ 는 처음에는 짜증나지만, 사실 "선언 전에 변수를 쓰는 것" 자체를 막아주는 안전장치입니다. 이런 코드를 컴파일 시점에 발견할 수 있게 됩니다.

네이밍 컨벤션 — 어떻게 이름 짓나

  • camelCase — JS 표준. userName, totalScore, isAdmin
  • UPPER_SNAKE_CASE — 절대 안 바뀌는 상수. const MAX_RETRY = 3
  • PascalCase — 생성자 함수·클래스만. class User { }
  • _underscore — "내부 전용" 표시 (관습일 뿐, 진짜 비공개는 #private 필드 23편)
  • 피하기 — 한 글자(a, b), 숫자 시작(1user), 예약어(class, function)

기억할 한 줄. "const 가 기본, 바꿔야 하면 let, var 는 사용 금지." 이 한 줄만 지켜도 변수 관련 버그의 90% 가 사라집니다. ESLint 의 prefer-const·no-var 규칙이 이를 자동으로 강제해 줍니다.

4편 — JS 자료형 7가지

number·string·boolean·null·undefined·symbol·bigint — 각 타입의 특징과 typeof 로 확인하는 법.

📚 쉽게 배우는 자바스크립트 교재
이전: 2편 첫 프로그램 · 현재: 3편 (입문) · 다음 → 4편 자료형 · 진행: 3/26

© 2026 주나이테크(주) @JUNAITECH