정의되지 않음 vs 정의되지 않음

발행: (2026년 2월 25일 오전 12:30 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

Undefined

undefined는 JavaScript에서 특별한 키워드입니다. 변수가 메모리에 존재하지만 아직 값이 할당되지 않은 상태를 의미합니다.

실행 컨텍스트의 생성 단계에서 JavaScript는:

  1. var x와 같은 선언을 감지합니다.
  2. x를 위한 메모리를 할당합니다.
  3. 기본값을 할당합니다 → undefined.

x에 대한 메모리 슬롯이 이미 존재하기 때문에, 명시적인 할당 전에 x에 접근하면 오류가 발생하지 않고 undefined가 출력됩니다.

undefined는 “비어 있음”이 아니라 자체 메모리 공간을 차지하며, 변수가 구체적인 값을 받을 때까지 자리표시자 역할을 합니다.


Not Defined

“not defined” 상황은 변수가 한 번도 메모리를 할당받지 않은 경우에 발생합니다.

console.log(y); // ReferenceError: y is not defined

이 오류는 “값이 없음”을 의미하는 것이 아니라 JavaScript가 식별자 y 자체를 전혀 알지 못한다는 뜻입니다.

생성 단계에서 JavaScript는 선언(var, function, let, const)을 스캔합니다. y가 선언되지 않았기 때문에 메모리 슬롯이 생성되지 않으며, 이를 접근하려는 모든 시도는 ReferenceError를 일으킵니다.

  • undefined → 메모리는 존재하지만 값이 없습니다.
  • not defined → 메모리가 존재하지 않습니다.

이 판단은 실행이 시작되기 전에 이루어지며, 런타임에 발생하는 것이 아닙니다.


Creation vs. Execution Phases

JavaScript는 코드를 두 개의 구별된 단계로 처리합니다:

  1. 메모리 할당 (Creation Phase)

    • 선언이 끌어올려집니다.
    • 메모리 슬롯이 생성되고, var의 경우 undefined로 초기화됩니다.
  2. 실행 단계 (Execution Phase)

    • 코드를 한 줄씩 실행하면서 앞서 준비된 메모리 슬롯을 사용합니다.

변수가 할당된 경우(예: var x) 실행 단계에서 그 값을 읽을 수 있습니다(undefined에서 할당된 값으로 변함).
변수가 전혀 할당되지 않은 경우(예: y) 실행 단계에서 ReferenceError가 발생합니다.


letconst

letconst도 생성 단계에서 메모리를 받지만, JavaScript는 초기화될 때까지 접근을 차단합니다. 이를 Temporal Dead Zone (TDZ)이라고 합니다. 선언 전에 읽으려 하면 메모리 슬롯은 존재하지만 ReferenceError가 발생합니다.

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

Conclusion

undefined와 “not defined”는 단순히 표현상의 차이가 아니라 JavaScript에서 근본적으로 다른 메모리 상태를 나타냅니다:

  • undefined – 선언된 변수가 메모리에 존재하지만 할당된 값이 없습니다.
  • Not defined – 식별자가 선언되지 않아 메모리 슬롯 자체가 없습니다.

이 구분을 이해하면 JavaScript가 코드를 실행 전에 어떻게 준비하는지 명확히 알 수 있으며, 흔히 발생하는 런타임 오류를 피하는 데 도움이 됩니다.

0 조회
Back to Blog

관련 글

더 보기 »

JavaScript 함수 소개 (화살표 함수 포함)

JavaScript의 함수 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록이며, 호출될 때만 실행됩니다. 함수는 우리에게 다음과 같은 도움을 줍니다: - 피하기…