데이터 타입

1. 데이터 타입

자바스크립트(ES6)는 7개의 데이터 타입을 제공한다.

7개의 데이터 타입은 원시타입primitive type과 객체 타입object / reference type으로 분류할 수 있다.

원시 타입: number, string, boolean, undefined, null, symbol

객체 타입: 객체, 함수, 배열 등

2. number 타입

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)

숫자타입의 세가지 특별한 값이다.

3. string 타입

string 타입은 텍스트 데이터를 나타내는 데 사용한다.

문자열은 작은따옴표’’큰따옴표 "" 또는 백틱```` 으로 텍스트를 감싸서 사용한다.

자바스크립트의 stringprimitive 타입이며, 변경 불가능한 값 immutable value 이다.

템플릿 리터럴 ````

ES6 부터 도입된 템플릿 리터럴은

멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.

  1. multiline string: 템플릿 문자열 내에서는 이스케이프 문자를 사용하지 않고도 줄바꿈과 공백이 있는 그대로 적용된다.
  2. expression interpolation: ${ ... } 을 이용해 표현식을 감싸서 문자열에 삽입할 수 있다.
  3. tagged template:

4. boolean 타입

논리적 참true, 거짓false 두가지가 있다

5. undefined 타입

undefined 타입의 값은 undefined 가 유일하다.

let a;
console.log(a); // undefined

var, let 키워드로 선언한 변수는 암묵적으로 undefined로 초기화 된다.

다시 말해, 변수 선언에 의해 확보된 메모리 공간은

처음 할당이 되기 전까지는 빈상태로 내버려두지 않고, 자바스크립트 엔진이 undefined 로 초기화한다.

변수를 참조했을 때 undefined가 반환된다면 초기화되지 않은 변수라는 것을 간파할 수 있다.

따라서 undefined을 개발자가 직접 변수에 할당하는건 undefined의 본래 취지에 어긋나고, 혼란을 주므로 권지하지 않는 행동이다.

대신 null을 할당하여 변수에 값이 없다는 것을 명시할 수 있다.

6. null 타입

null타입의 값은 null타입이 유일하다.

변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미다.

그러면 자바스크립트 엔진은 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행한다.

7. Symbol 타입

symbol 타입은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 primitive 타입의 값이다.

symbol 값은 다른 값과 중복되지 않는 유일한 값이다.

따라서 주로 객체의 유일한 property key를 만들기 위해 사용한다.

symbol 이외의 primitive값은 리터럴을 통해 생성하지만 symbolSymbol 함수를 호출하여 생성한다.

// 심벌 값 생성
let key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
let obj = {};
// 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value

근데 사실 잘 안씀

8. 객체 타입

지금까지 언급한 6가지의 primitive 타입 이외의 값은 전부 객체 타입이다.

9. 데이터타입의 필요성

  • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
  • 값을 참조할 때 한번에 읽어 들어야할 메모리 공간의 크기를 결정하기 위해
  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

10. 동적 타이핑 dynamic typing

동적 타입 언어와 정적 타입 언어

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)

방식을 택하여 사용한다.