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

Benza·2022년 10월 13일
0

데이터 타입 === 값의 종류

자바스크립트의 모든 값은 데이터 타입을 갖는다.

자바스크립트는 7개의 원시타입(primitive type)과 1개의 객체 타입으로 분류할 수 있다.

  • 원시 값 (언어의 최고 로우레벨에서 직접 표현되는 불변 데이터)
    • Boolean 타입
    • Null 타입
    • Undefined 타입
    • Number 타입
    • String 타입
    • Symbol 타입
    • BigInt 타입 (새로 추가 됨)
  • 객체 (속성의 컬렉션)

6.1. 숫자 타입

ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다.
즉, 모든 수를 실수로 처리하고, 정수를 위한 데이터 타입은 존재하지 않는다.

NaN도 number type임을 기억하자

typeof NaN // number

NaN은 값이 아닌 식별자이므로 대소문자에 유의해야한다.

BigInt

BigInt: Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체

BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있다.

const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n

const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n

const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n

6.2. 문자열 타입

16비트 유니코드 문자의 집합
따옴표로 감싸지 않은 문자는 식별자로 인식한다.

var string = hello; // ReferenceError: hello is not defined

6.3. 템플릿 리터럴

ES6부터 도입된 새로운 문자열 표기법

백틱을 사용해 표현한다.

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

6.4. 불리언 타입

참과 거짓을 나타내는 true / false

6.5. undefined 타입

값을 지정하지 않았을 때 자동으로 undefined가 들어간다.
변 수의 값이 없다는 것을 명시하고 싶을 때는 undefined가 아니고 null을 사용해야한다.

undefined는 '정의되지 않은'이라고 직역 된다.
정의란 변수에 값을 할당하여 변수의 실체를 명확히하는 것
즉, undefined는 값이 할당되지 않은 변수의 실체가 명확하지 않은 값이다.

ECMAScript 사양에서 변수는 '선언한다' 라고 표현
함수는 '정의한다'라고 표현한다.

6.6. null 타입

대소문자를 구분한다. 식별자이므로 대소문자에 유의해야한다.
함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.

var element = document.querySelector('.없는선택자')
console.log(element) // null

6.7. 심벌 타입

ES6에서 추가된 7번째 타입
변경 불가능한 원시타입

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

var a = Symbol('abc'); // abc는 개발자가 구분하기 위한 값
var b = Symbol('abc'); 

a === b // false

주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.

6.8. 객체 타입

11장 "원시 값과 객체의 비교"에서...

6.9. 데이터 타입의 필요성

들어가기전에...

var a = 100
var b = 100
100 -> 0x123
a: 0x001 -> 0x123
b: 0x002 -> 0x123

100이라는 숫자는 유일무이한 불변값이다.
원시 타입 값들은 하나의 값에 대해서 하나의 메모리에 저장하게 되어있고, 변수 값이 같다면 모두 같은 메모리를 참조한다.

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

메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다.
자바스크립트 엔진은 테이터 타입, 즉 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다. 즉, 변수에 할당된느 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.

ECMAScript 사양은 문자열과 숫자 타입 외의 데이터 타입의 크기를 명시적으로 규정하고 있지는 않다.
따라서, 자바스크립트 엔진 제조사 별로 메모리 공간 크기가 다를 수 있다.

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

모든 값은 데이터 타입을 가지며, 메모리에 2진수로 저장된다.
메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.

데이터 타입이 필요한 이유
1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
2. 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
3. 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

6.10. 동적 타이핑

자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론-type inference) 된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
변수는 타입을 갖지 않지만, 값은 타입을 갖는다.
이런 특징을 동적 타이핑(dynamic typing)이라 한다.
즉 자바스크립트는 동적 타입언어이다.

장점 - 유연성 ⬆️

어떤 데이터 타입의 값이라도 자유롭게 할당 할 수 있다.

단점 - 신뢰성 ⬇️

변수의 값은 언제든지 변경될 수 있다.

  • 복잡한 프로그램에서 변수의 값을 추적하기 어려울 수 있다.
  • 값의 변경에 의해 타입도 변경 될 수 있기 때문에, 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.
  • 자바스크립트는 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 변환되기도 한다.

동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어진다

변수 사용 주의사항

  • 필요한 경우에 한해 제한적으로 사용하라
    • 변수 값은 재할당에 의해 언제든 변경가능하므로 변수가 많으면 추적이 어려워 오류 발생 확률이 높아진다.
  • 변수의 스코프는 좁게 만들어야한다.
  • 전역 변수를 최대한 사용하지 않도록 한다.
    • 의도치 않게 값이 변경될 가능성이 높다.
    • 복장성을 증가 스키고 추적을 어렵게 만든다.
  • 변수보다는 상수를 사용해 변경을 억제한다.
  • 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다.
profile
Understanding the impression

0개의 댓글