JavaScript의 변수 선언 방식: var, let, const

Obebe·2026년 3월 16일

JavaScript

목록 보기
7/7

JavaScript에서 변수를 선언하는 방법은 크게 세 가지가 있다.

var
let
const

이 세 가지는 모두 변수를 선언하는 키워드이지만 스코프(scope), 재선언 여부, 호이스팅 방식 등이 서로 다르다.
특히 ES6 이후에는 letconst가 등장하면서 var의 사용이 점점 줄어들게 되었다.

이번 글에서는 var, let, const의 특징을 살펴보고 서로 어떻게 다른지 비교해 보겠다.


1️⃣ var

var는 JavaScript 초기부터 존재하던 변수 선언 방식이다.

특징

  1. 재선언 가능
var a = 10;
var a = 20;

console.log(a); // 20

같은 이름의 변수를 다시 선언해도 에러가 발생하지 않는다.


  1. 재할당 가능
var a = 10;
a = 30;

console.log(a); // 30

값을 다시 할당하는 것도 가능하다.


  1. 함수 스코프 (Function Scope)

var는 함수 단위로 스코프가 생성된다.

function test() {
  var a = 10;
}

console.log(a); // error

하지만 블록문에서는 스코프가 생성되지 않는다.

if (true) {
  var a = 10;
}

console.log(a); // 10

이 때문에 의도하지 않은 변수 접근이 발생할 수 있다.


  1. 호이스팅 (Hoisting)

var로 선언된 변수는 선언이 코드의 최상단으로 끌어올려진 것처럼 동작한다.

console.log(a);
var a = 10;

실제로는 다음과 같이 동작한다.

var a;
console.log(a); // undefined
a = 10;

그래서 선언 전에 접근하면 undefined가 출력된다.


2️⃣ let

let은 ES6에서 도입된 변수 선언 방식이다.
기존 var의 문제점을 보완하기 위해 등장했다.

특징
1. 재선언 불가능

let a = 10;
let a = 20; // error

같은 스코프에서 같은 이름의 변수를 다시 선언할 수 없다.


  1. 재할당 가능
let a = 10;
a = 30;

console.log(a); // 30

값 변경은 가능하다.


  1. 블록 스코프 (Block Scope)

let은 블록 단위로 스코프가 생성된다.

if (true) {
  let a = 10;
}

console.log(a); // error

이 특징 덕분에 변수의 사용 범위를 더 안전하게 관리할 수 있다.


  1. Temporal Dead Zone (TDZ)

let은 선언 전에 접근할 수 없다.

console.log(a); // error
let a = 10;

이 구간을 Temporal Dead Zone (TDZ)이라고 한다.


3️⃣ const

const는 상수(Constant)를 선언할 때 사용하는 키워드이다.

특징

  1. 재선언 불가능
const a = 10;
const a = 20; // error

  1. 재할당 불가능
const a = 10;
a = 20; // error

  1. 선언과 동시에 초기화 필요
const a; // error

반드시 선언과 동시에 값을 할당해야 한다.


  1. 객체와 배열은 내부 값 변경 가능
const user = { name: "Kim" };

user.name = "Lee";

console.log(user.name); // Lee

const는 변수의 재할당을 막는 것이지
객체 내부 값을 변경하는 것까지 막지는 않는다.


정리

var는 호이스팅과 함수 스코프 때문에 예측하기 어려운 동작을 만들 수 있다.
그래서 ES6 이후에는 letconst를 사용하는 것이 일반적이다.

보통 다음과 같은 기준으로 사용한다.

기본적으로 const 사용
값이 변경될 가능성이 있으면 let 사용
var는 사용하지 않음

이 방식이 변수의 변경 가능성을 명확하게 하고 코드의 안정성을 높여 준다.

profile
다른 건 노력의 시간

0개의 댓글