모든 프로그래밍 언어에는 내장된 자료구조가 존재하지만 보통 그 내용은 언어마다 다릅니다.
그중 JavaScript는 느슨한(loosely typed)타입의 의 동적(dynamic) 언어입니다.
JavaScript의 변수는 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당 (및 재할당) 가능합니다.
JavaScript의 데이터 타입은 원시 값과 객체로 나뉘어집니다.
"심볼" 데이터 형식은 값으로 익명의 객체 속성(object property)을 만들 수 있는 특성을 가진 원시 데이터 형식(primitive data type)입니다.
이 데이터 형식은 클래스나 객체 형식(object type)의 내부에서만 접근할 수 있도록 전용(private) 객체 속성의 키(key)로 사용됩니다.
심볼 데이터 형식은 고도로 특화된 용도로 쓰이며, 범용성은 현저히 떨어집니다
const num = 10;
이런식으로 우리가 10이라는 숫자를 변수에 담으면, JavaSciprt는 내부적으로 숫자 10이라는 값을 할당하기 위해
메모리 공간(Number = 8 byte)을 확보하고, 그 공간을 num이라는 이름을 붙여줍니다. 그리고 num에는 2진수의 형태로 숫자 10이 저장됩니다.
우리가 변수에 할당하려는 값의 '데이터 타입'에 따라 확보해야 할 메모리 공간의 크기가 결정됩니다.
이처럼 어떤 데이터를 저장하는 과정에서 얼마의 메모리 공간을 확보할 것인지 알기 위해 데이터 타입이 필요합니다.
num변수의 경우, 저장되어 있는 값이 number 타입이므로 8바이트 단위로 읽지 않으면 원하는 값을 얻어낼 수 없습니다.
이렇듯 JavaScript는 변수의 저장된 데이터를 참조할 때 얼만큼의 공간을 읽어 들일지 알기 위해 데이터 타입이 필요하다고 말할 수 있습니다.
만약 메모리에서 읽어들인 2진수를 0100 0001이라고 한다면, 이는 숫자 65일 수도 있고, 문자 'A'일 수도 있습니다.
이는 JavaScirpt가 해석하는 기준에 따라 달라지는데 JavaScript는 데이터 타입을 확인하여 숫자읹, 문자열인지 해석하여 원하는 값을 얻어내도록 합니다.
정적 타이핑은 프로그래밍의 어르신인 C언어를 에로 들수 있습니다.
C언어에서는 변수를 선언할 때에 타입을 선언해줘야합니다.
int num = 20010314; // 정수
float num = 2001.0314; // 실수
char str = 'birthday'; // 문자
하지만 우리가 쓰는 JavaScript는 동적 타입의 언어라고 언급했습니다.
타입을 명시해주지 않아도 JavaScript 엔진이 알아서 할당해주기 때문에 편리하다는 장점이 있습니다.
하지만 너무나 자유롭기 때문에 타입이 의도치않게 자기 멋대로 변경되는 경우가 생기기도 합니다.
이러한 결점은 규모가 큰 프로젝트에서 심각한 에러로 발전될 확률이 높습니다.
이런 에러를 예방하고자 규모가 큰 프로젝트, 여러 회사에서 TypeScript를 적극 사용하고 있습니다.
JavaScript는 특정 타입의 값을 기대하는 곳에 다른 타입의 값이 오면 자동으로 타입을 변환시킵니다.
const a = "10";
const b = "20";
const result = a + b;
console.log(result); // 1020
result = a - b;
console.log(result); // -10
result = a * b;
console.log(result); // 200
const c = "문자";
result = c - a; // NaN
위의 예시에서 만약 a + b를 숫자로 계산하고 싶다면 어떻게 할까요?
그럴때 사용하는 것이 명시적 타입변환입니다.
대표적으로 명시적 타입변환 메소드인 Number()
, String()
등이 그렇습니다.
const result = Number(a) + Number(b)
이런식으로 인자에 대한 타입을 명시적으로 변환시켜 계산하게 됩니다.
논리합, 논리곱 연산자를 이용한 표현식은 언제나 truthy, falsy 값 중 하나로 판별됩니다.
JavaScript에선 이 표현식을 수행하던중 어느 한쪽이 확실해졌을 때, 더 이상 표현식을 계산하지 않고 바로 확실해진 값을 반환해줍니다.
Reference.
데이터 타입
데이터 타입의 필요성
정적 타이핑, 동적 타이핑
JavaSciprt 타입 변환
JS 단축평가