최근 수정 시각 : 2024-05-29 01:10:44

undefined



파일:나무위키+유도.png  
은(는) 여기로 연결됩니다.
동명의 해체된 오버워치 프로게임단에 대한 내용은 UNDEFINED(프로게임단) 문서
번 문단을
부분을
, Xdinary Heroes의 노래에 대한 내용은 UNDEFINED(Xdinary Heroes) 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
, 에 대한 내용은 문서
번 문단을
번 문단을
부분을
부분을
참고하십시오.
파일:관련 문서 아이콘.svg   관련 문서: 컴퓨터/표현
,
,
,
,
,

프로그래밍 언어 문법
{{{#!wiki style="margin: -16px -11px; word-break: keep-all"<colbgcolor=#0095c7><colcolor=#fff,#000> 언어 문법 C(포인터) · C++(자료형 · 클래스 · 이름공간 · 상수 표현식 · 특성) · C# · Java · Python · Kotlin · MATLAB · SQL · PHP · JavaScript
마크업 문법 HTML · CSS
개념과 용어 함수 · 인라인 함수 · 고차 함수 · 람다식 · 리터럴 · size_t · 상속 · 예외 · 조건문 · 참조에 의한 호출 · eval
기타 == · === · NaN · null · undefined · 모나드 · 배커스-나우르 표기법
프로그래밍 언어 예제 · 목록 · 분류 }}}


1. 개요2. undefined가 발생하는 경우3. 왜 있는가?

1. 개요

JavaScript언어에서 '아직 할당하지 않은 값'을 표현하기 위해 사용하는 값. null과는 사용 방식이 약간 다른데, null이 아예 '일부러 비워 둔 값'을 의미하는 것이라면, undefined는 아직 변수 또는 프로퍼티가 할당되지 않았음을 의미한다. undefined가 발생할 수 있는 상황을 'undefined behavior'라고 한다.

2. undefined가 발생하는 경우

자바스크립트에서는 정말 자주 볼 수 있는데, 객체에서 없는 프로퍼티를 꺼내려고 하거나[*
#!syntax javascript
const obj = {};
obj.a // undefined
], 함수를 호출할 때, 값이 들어오지 않은 매개변수를 사용하려 한다거나[*
#!syntax javascript
function f(a, b) {
    console.log(a);
    console.log(b);
}
f(1) // a는 1이 나오지만, b는 undefined로 출력됨
], 아직 값이 할당되지 않은 변수를 사용하려 할 때[*
#!syntax javascript
let a;
a // undefined
][1], 배열의 범위를 넘어서는 값을 가져오려 할 때[*
#!syntax javascript
[1, 2, 3][3] // undefined
][2], 그리고 함수가 아무것도 반환하지 않을 때[*
#!syntax javascript
function a () {}
a() // undefined
]도 undefined를 만날 수 있다!

이런 특징으로 인해 디버깅이 상당히 어려워 지는데, undefined는 (객체가 아니기에)속성도 가지지 않고, (함수도 아니기에) 호출할 수도 없다. 그래서 코드 중간에서 오타 등으로 인해 존재하지 않는 프로퍼티를 꺼냈을 때, 원하는 값 대신 undefined가 나오게 되고, 이 값을 나중에 사용하는 부분에서 Uncaught TypeError: Cannot read property '...' of undefined또는 Uncaught TypeError: ... is not a function등의 오류를 맞닥트리게 되며, 버그의 원인과 발견 지점이 멀어지게 되고, 결국엔 디버깅 난이도를 높이게 된다. 즉, Java같은 상식대로면 진작에 값이 없는 것을 참조하므로 NullPointer Exception이 발생해서 멈췄을 부분에서 조용히 지나가버리게 되기 때문이다.

undefined로 연산을 할 경우 NaN이 나오는 경우도 있기 때문에, 대문자 N을 찾아다니는 JSFuck을 쓰는 개발자에겐 도움이 될 수도 있다(?)[3]

자바스크립트 뿐만 아니라, 몇몇 GCC에서는 선언만 된 배열의 주소를 반환하는 것이 경고만 뜨고 허용되는 경우가 있다고 한다.

3. 왜 있는가?

위의 문제점에서 보다시피 undefined는 디버깅에 혼선을 주는데다 아무 쓸모도 없어서 대체 왜 있는가 싶지만, 이것의 진정한 의의는 오버헤드를 줄여 런타임을 최적화 하는데 있다.

참조할 변수에 할당이 이뤄졌는지를 먼저 체크하면 이런식의 런타임 에러는 막을 수 있겠지만 그만큼 시간이 더 걸리기 때문에, 성능을 확보한 대신 이러한 상황을 개발자에게 막도록 한 것이다. 특히 undefined를 자주(...) 볼 수 있는 자바스크립트는 대체로 웹브라우저에서의 동작을 상정하는데, 웹브라우저의 처리성능은 Native로 돌리는 것에 비해 대개 처참한 수준이므로 이런식으로라도 최적화가 이뤄져야한다.[4]

[1] 참고로 아예 선언 자체를 안한 변수를 사용하려고 하면 Uncaught ReferenceError: ... is not defined예외가 발생한다.[2] 다만 이 경우는 1번 경우의 특수한 사례인데, 자바스크립트에서 배열은 객체의 일종이기 때문이다. 즉 arr라는 배열이 있을 때, arr[0]는 arr객체의 0이라는 프로퍼티를 꺼낸 것과 같다.[3] [][[]]+[][[]] 만으로 NaN이 나온다![4] 생략한 설명이 많지만 이 문제는 꽤 예전(92년도!)에 다뤄졌던 '컴파일러가 C 표준을 무시하지 않고 임의대로 처리해도 되는가'라는 'Nazal Demon 문제(악마가 코로 들어갈 수 있어도 되는가)에 관한 토론'링크에서 잘 다루고 있다. 토론 당시에 비해 하드웨어 성능도 월등해지고 소프트웨어도 규격/정밀화된 지금은 거의 '언어 컨셉'에 따라 undefined behavior를 허용하는 것으로 굳어졌다.