모던 자바스크립트 Deep Dive

[모던 자바스크립트 Deep Dive] 데이터 타입

개발깎새 2024. 4. 22. 22:44

데이터 타입은 값의 종류를 말하며, ES6는 7개의 데이터 타입을 제공한다.
7개의 데이터 타입은 원시 타입객체 타입으로 분류 할 수 있다.

  • 원시타입: 숫자, 문자열, 불리언, undefined, null, symbol
  • 객체타입: 객체, 함수, 배열 등6-1 숫자 타입

숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따름. 즉 모든 수를 실수로 처리하고 정수만 표현하기 위한 데이터 타입은 존재 하지 않음

// 숫자타입은 모두 실수로 처리된다.
console.log(1 === 1.0); // true 

숫자 타입은 추가적으로 세 가지 특별한 값도 포함한다.

  • Infinity : 양의 무한대
  • -Infinity : 음의 무한대
  • NaN (not a number) : 산술 연산 불가

6-2 문자열 타입

문자열 타입은 0개 이상의 16비트 유니코드 문자 (UTF-16) 의 집합이다.

문자열은 '', "", 백틱으로 텍스트를 감싸서 표현한다.

자바스크립트에서 문자열은 원시 타입이며 변경 불가능한 값이다.

6-3 템플릿 리터럴

ES6 부터 백틱을 사용한 새로운 문자열 표기법이 도입되었다.
백틱내에서는 개행과 공백이 허용되고, ${} 를 통해 표현식을 넣을 수 도 있다.

var template = `
    <ul>
        <li>${1 + 1}</li>
    </ul>
`

6-4 불리언 타입

true와 false로 이루어져 있다. 조건문에서 자주 사용.

6-5 undefined 타입

자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값.

개발자가 의도적으로 변수에 할당하는 것은 undefined 의 본래 취지 와 맞지 않기 때문에 바람직 하지 않다.

개발자는 대신 null을 사용하는 것이 좋다.

6-6 null 타입

null은 개발자가 변수에 값이 없음을 의도적으로 명시 할 때 사용한다.

이는 참조를 명시적으로 제거하며, 해당 참조하지 않는 공간에 가비지 콜렉션을 수행 할 것이다.

6-7 심벌 타입

자바스크립트 객체 특성상 키 값은 유일하여야 한다.

십벌은 ES6에서 추가된 타입으로 다른 값과 중복되지 않는 유일한 값이다.

객체의 유일한 프로퍼티 키를 만들기 위해 사용된다.

6-8 객체 타입

자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것은 객체이다.

자바스크립트에서 6가지 원시 타입 외의 모든 값은 객체이다.

6-9 데이터 타입의 필요성

데이터 타입에 의한 메모리 공간의 확보와 참조

메모리에 값을 저장하려면 확보해야 할 메모리 공간의 크기를 결정해야 한다.

var score = 100;

위 코드 실행시 8바이트의 메모리 공간을 확보한다.
-> 자바스크립트에서 숫자는 배정밀도 64비트 부동소수점으로 표현하기 때문에 8바이트

8바이트로 할당되는 score


위의 그림은 참조이며 실수는 64비트 부동소수점 형식이기 때문에 실제 메모리에 위와 같이 저장되지는 않는다.

참조시 score 변수를 참조하면 8바이트 단위로 메모리 공간에 저장된 값을 읽어들인다.

데이터 타입에 의한 값의 해석

0100 0001 은 숫자로 65 문자로 'A' 로 해석된다. 해석의 기준 또한 값의 타입으로 해석한다.

정리하면 타입이 필요한 이유는

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

6-10 동적 타이핑

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

C 나 자바는 변수 선언시 타입을 명시한다. 이를 명시적 타입 선언 이라고 한다. 컴파일 시점에 타입 체크를 진행한다.

자바스크립트는 정적 타입 언어와 다르게 변수 선언 시점이 아닌 할당 시에 타입을 추론한다.

var foo;
console.log(typeof foo); // undefined;

foo = 3;
console.log(typeof foo); // number

foo = 'hello';
console.log(typeof foo); // string

foo = true;
console.log(typeof foo); // booean

foo = null;
console.log(typeof foo); // object

foo = Symbol();
console.log(typeof foo); // symbol

foo = {};
console.log(typeof foo); // object

foo = [];
console.log(typeof foo); //object

foo = function () {};
console.log(typeof foo); // function

자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 얼마든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑 이라고 한다.

위와 같은 언어는 동적 타입 언어라고 한다.

동적 타입 언어와 변수

이러한 언어의 특징은 타입에 대해 유연하지만 반대로 신뢰성이 낮다.

안정적인 프로그램을 만들기 위해 변수를 사용하기 이전 데이터 타입을 체크하는 코드를 넣으면 코드의 양도 늘어나고 번거롭다.