데이터 타입
1. 데이터 타입
자바스크립트(ES6)는 7개의 데이터 타입을 제공한다.
7개의 데이터 타입은 원시타입primitive type
과 객체 타입object / reference type
으로 분류할 수 있다.
원시 타입: number
, string
, boolean
, undefined
, null
, symbol
객체 타입: 객체, 함수, 배열 등
number
타입
2. number
타입의 값은 64비트 부동소수점 형식을 따른다.
즉, 모든 수를 실수로 처리하며, 정수를 위한 데이터 타입은 없다.
let binary = 0b01000001; // 2진수
let octal = 0o101; // 8진수
let hex = 0x41; // 16진수
// 표기법만 다를 뿐 모두 같은 값이다.
console.log(binary); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary === octal); // true
console.log(octal === hex); // true
정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 64비트 2진수로 저장된다.
따라서 이 값을 참조하면 모두 10진수로 해석된다.
특별한 값 표현
Infinity
: 양의 무한대-Infinity
: 음의 무한대NaN
: 산술 연산 불가(not-a-number)
숫자타입의 세가지 특별한 값이다.
string
타입
3. string
타입은 텍스트 데이터를 나타내는 데 사용한다.
문자열은 작은따옴표’’
큰따옴표 ""
또는 백틱```` 으로 텍스트를 감싸서 사용한다.
자바스크립트의 string
은 primitive
타입이며, 변경 불가능한 값 immutable value
이다.
템플릿 리터럴 ````
ES6 부터 도입된 템플릿 리터럴은
멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
multiline string
: 템플릿 문자열 내에서는 이스케이프 문자를 사용하지 않고도 줄바꿈과 공백이 있는 그대로 적용된다.expression interpolation
:${ ... }
을 이용해 표현식을 감싸서 문자열에 삽입할 수 있다.tagged template
:
boolean
타입
4. 논리적 참true
, 거짓false
두가지가 있다
undefined
타입
5. undefined 타입의 값은 undefined
가 유일하다.
let a;
console.log(a); // undefined
var
, let
키워드로 선언한 변수는 암묵적으로 undefined
로 초기화 된다.
다시 말해, 변수 선언에 의해 확보된 메모리 공간은
처음 할당이 되기 전까지는 빈상태로 내버려두지 않고, 자바스크립트 엔진이 undefined
로 초기화한다.
변수를 참조했을 때 undefined
가 반환된다면 초기화되지 않은 변수라는 것을 간파할 수 있다.
따라서 undefined
을 개발자가 직접 변수에 할당하는건 undefined
의 본래 취지에 어긋나고, 혼란을 주므로 권지하지 않는 행동이다.
대신 null
을 할당하여 변수에 값이 없다는 것을 명시할 수 있다.
null
타입
6. null
타입의 값은 null
타입이 유일하다.
변수에 null
을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미다.
그러면 자바스크립트 엔진은 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다.
Symbol
타입
7. symbol
타입은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 primitive 타입의 값이다.
symbol
값은 다른 값과 중복되지 않는 유일한 값이다.
따라서 주로 객체의 유일한 property
key를 만들기 위해 사용한다.
symbol
이외의 primitive
값은 리터럴을 통해 생성하지만 symbol
은 Symbol
함수를 호출하여 생성한다.
// 심벌 값 생성
let key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
let obj = {};
// 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value
근데 사실 잘 안씀
8. 객체 타입
지금까지 언급한 6가지의 primitive
타입 이외의 값은 전부 객체 타입
이다.
9. 데이터타입의 필요성
- 값을 저장할 때 확보해야 하는
메모리 공간의 크기를 결정
하기 위해 - 값을 참조할 때 한번에 읽어 들어야할
메모리 공간의 크기를 결정
하기 위해 - 메모리에서 읽어 들인
2진수를 어떻게 해석할지 결정
하기 위해
dynamic typing
10. 동적 타이핑 동적 타입 언어와 정적 타입 언어
C
, Java
같은 정적static
타입 언어는 변수를 선언할 때 데이터 타입을 선언해야 한다.
이를 명시적 타입 선언 explicit type declaration
이라 한다.
정적 타입 언어는 컴파일 시점에 타입 체크를 수행한다.
자바스크립트는 let
, const
키워드를 이용해 변수를 선언한다.
이때 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
다시 말해, 자바스크립트의 변수는 선언이 아닌, 할당에 의해 타입이 결정(타입 추론 type inference
) 된다.
그리고 재할당에 의해 변수 타입은 언제든지 동적으로 변할 수 있다.
이를 동적 타이핑 dynamic typing
이라 한다.
따라서 자바스크립트는 동적dynamic
타입 언어이다.
동적 타입 언어와 변수
동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.
따라서 동적 타입 언어는 유연flexibility
하지만 신뢰성reliability
은 떨어진다.
변수를 선언할 때 주의사항
- 변수
let
보다는 상수const
를 사용해 값의 변경을 억제한다. - 전역 변수
var
는 최대한 사용하지 않는다. - 변수 이름은 신중하게 짓는다.
Typescript
자바스크립트를 정적 타입으로 사용하기: 동적 타입 언어인 자바스크립트를 정적 타입으로 사용할 수 있게 해주는
Javascript
의 Superset인 Typescript
가 있다.
Typescript
는 코드를 작성할 때 변수에 타입을 직접 지정할 수 있게 해준다.
하지만 다른 정적 언어와는 살짝 다른 차이가 있다.
자바는 Nominal Typing
방식을 택했고 타입스크립트는 Structural Typing(Duck Typing)
방식을 택하여 사용한다.