본문 바로가기
이론/Frontend

JavaScript의 타입 (Type of JavaScript)

by 유세지 2021. 2. 15.

자바스크립트는 타입에 있어 굉장히 유연하게 동작하는 언어입니다. 변수에 들어있는 값이 숫자이든, 문자열이든 쓰임에 따라서 자동으로 변환되고 맞춰지기 때문에 상대적으로 다른 강타입, 정적 언어들에 비해 크게 문제를 느끼지 않는 경우가 일반적입니다.

 

하지만 그런 자바스크립트에도 타입은 분명히 존재합니다. 이번 포스팅에서는 자바스크립트의 타입에 대해 조금 더 자세히 알아보겠습니다.

 

 

타입의 종류

자바스크립트의 내장 타입은 7가지가 있습니다.

 

  • null
  • undefined
  • boolean
  • number
  • string
  • object
  • symbol

 

object를 제외한 나머지 여섯 개의 타입들을 원시 타입(primitives) 이라고 부릅니다.

값이 어떤 타입을 갖고 있는지 확인하려면 typeof 연산자를 사용하면 됩니다.

 

 

그러나 한 가지 예외가 있습니다.

 

 

?

타입 null의 경우 분명한 원시 타입이지만 typeof 를 통해 얻은 반환값은 object입니다. null이 object의 하위 개념이거나 한 것은 아니고, 그저 버그입니다. null의 타입은 null이 맞습니다. 다만 20년 이상을 수정되지 않고 버텨오면서 자바스크립트의 일부분이 되어버린 비운의 버그입니다.

 

이제와서 이 버그를 고치기에는 너무 늦어버렸고, 잘 돌아가던 셀 수 없이 많은 서비스들에 문제가 생길 수 있기 때문에 손대기 어려운 위치가 되어버렸습니다.

 

다행히도 null 타입을 검사할 수 있는 방법이 없는 건 아닙니다. null이 falsy한 특징을 가지는 것을 이용해 조건을 하나 더 붙여 검사합니다.

 

!(null 타입 변수) = true

 

 

추가적으로 typeof 의 반환 값에는 원시타입에 더해 "function" 이 있습니다. 명세에 따르면 function은 object의 하위타입이지만 typeof의 반환값으로도 출력되는 특수한 케이스입니다. 

 

"function"

 

 

변수에는 타입이 없다

다른 언어와 구분되는 자바스크립트의 특징입니다. C 언어를 예로 들면, 변수를 생성할때 적절한 자료형을 붙여서 생성하는 것이 익숙하실겁니다. 

 

int 를 사용해 length를 선언한 모습

 

그러나 자바스크립트의 변수에는 타입이 없습니다. 실제로 우리가 변수를 선언할때의 모습을 생각해보면, 값에 상관없이 앞에 붙이는 키워드가 동일했음을 알 수 있습니다.

 

var, let, const 세 개면 끝.

값으로 들어오는 타입이 무엇이든 선언자는 var, let, const 중 하나입니다.

 

결론적으로, 자바스크립트에선 변수에는 타입이 없고 오직 값에만 타입이 존재합니다. 변수 안에 담긴 값에 따라 그 타입은 시시각각 변화합니다. 위에서 살펴본 typeof 도 사실 변수가 아닌 변수가 가지고 있는 값의 타입을 확인하는 연산자였던 것입니다.

 

여담으로 typeof 의 반환값은 모두 문자열(string) 입니다.

 

 

undefined != undeclared

보통 값이 없는 변수를 출력해보면 undefined 를 얻게됩니다. 그러나 정의되지 않은 변수를 출력하려고 시도하면 reference error를 받게되는데 이때 오류 메시지로 (변수이름) is not defined 라는 문구를 볼 수 있습니다.

 

undefined 와 undeclared는 다릅니다

undefined는 접근이 가능한 스코프에 변수가 존재하지만, 그 값이 할당되지 않은 상태를 나타내는 것이고 undeclared는 변수가 선언조차 되어있지 않은 상태입니다. 두 상태의 차이점을 분명하게 알고 넘어가셔야 합니다.

 

여기서 한 가지 재미있는 점은 typeof로 undeclared 상태의 변수를 검사하면 undefined가 나온다는 것입니다. 빨간 오류메시지가 아닌 정상적인 undefined가 출력되는데 이는 typeof의 안전 가드(safety guard) 입니다.

 

다른 파일에 있는 변수를 참조하기 위해 검사하는 용도로 typeof 를 사용하면, 레퍼런스 오류 없이 검사가 가능해집니다. 안전 가드 덕분에 안정적인 체크를 할 수 있게 됩니다.

 

 

 

 

정리

  • 자바스크립트는 내장 타입으로 null, undefined, boolean, number, string, object, symbol 을 가집니다.
  • 변수에는 타입이 없고, 값에만 타입이 존재합니다.
  • undefined와 undeclared는 다릅니다.

 

 

반응형

댓글