자바스크립트의 데이터 타입은 기본적으로 원시 타입(Primitive type)
과 참조 타입(Reference type)
으로 나누어진다. 이 중 원시 타입
에는 number
, string
, boolean
, null
, undefined
가 존재하며, 이를 제외한 함수 등의 나머지 형태는 참조 타입
으로 볼 수 있다. 원시 타입
과 참조 타입
의 대표적인 차이점은 바로 값에 접근하는 방식으로, 원시 타입
은 데이터 할당 시 값이 저장된 메모리 영역에 직접 접근하지만 참조 타입
은 변숫값이 저장된 힙(heap) 메모리의 주소 값을 이용해 접근한다.
그 이유는 이러한 타입이 프로그래밍 언어가 제공하는 가장 기본적인 형태이기 때문이다. 원시 데이터의 정의에 따르면 원시 타입
은 'built-in', 즉 이미 내장된 타입이다. 따라서 원시 타입
은 우리가 자바스크립트에서 사용할 수 있는 가장 단순한 데이터 형식이다.
자바스크립트에서 원시 타입
이 아닌 모든 타입은 참조 타입
이다. 두 타입은 데이터를 보관하는 방식에서 차이가 있는데, 원시 타입
이 할당되면 변수에 값(value) 자체가 담기지만, 참조 타입
자료형이 할당될 때에는 보관함의 주소(reference)가 담긴다. 바로 이러한 이유에서 '참조'라는 이름이 붙게 된 것이다. 또한, 참조 자료형은 동적으로 크기가 변하는 특별한 데이터 보관함을 가지며, 이러한 보관함을 힙(heap) 이라고 부른다.
MDN에 따르면 자바스크립트는 기본적으로 '느슨한 타입(loosely typed) 언어, 혹은 동적(dynamic) 언어'이다. '느슨한 타입'이란 무슨 뜻일까? 그것은 바로 변수 타입을 미리 선언할 필요가 없다는 뜻이다. 이러한 타입의 반대인 C 언어와 같은 '엄격한 타입(strictly typed) 언어'는 변수 선언 시에 예약어를 이용하여 타입을 지정해야 한다. 그렇다면 자바스크립트의 타입은 언제 결정되는가? 바로 프로그램이 처리되는 과정, 정확히는 런타임 시 결정된다.
자바스크립트와 같은 동적타입 언어는 코드 작성 시에 변수의 타입을 고민할 필요 없이 바로 선언할 수 있기 때문에 유연성이 높다. 그러나 이러한 유연성은 예기치 않은 타입 에러를 발생시킬 확률을 높인다. 반대로 정적타입 언어는 코드 작성 시에 타입을 미리 결정해줘야 하는 번거로움이 있지만 타입 에러의 가능성은 줄어드는 장점이 있다.
참고
wikipedia - Primitive data type
MDN - 자바스크립트의 자료형
Negabaro 블로그