Post

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

서론

  • 자바스크립트의 모든 값은 데이터 타입을 갖는다.
  • ES6는 7개의 데이터 타입을 제공한다.
  • 데이터 타입은 원시 타입(primitive type)과 객체 타입(object/reference type)으로 분류한다.

원시 타입

  • 숫자 타입
  • 문자열 타입
  • 불리언 타입
  • undefined 타입
  • null 타입
  • 심벌 타입

객체 타입

  • 객체, 함수, 배열 등

6.1 숫자 타입

  • 자바스크립트는 하나의 숫자 타입만 존재한다.
  • 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다.
    • 배정밀도 64비트 부동소수점 형식: 일반적으로 메모리의 64비트를 차지하여 소수점을 이용해 숫자를 표현하는 방식
    • 따라서 모든 수를 실수로 처리한다.
    • 정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 이 형식을 따라 2진수로 저장된다.
  • 자바스트립트는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않는다.

    • 따라서 참조 시 모두 10진수로 해석된다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var binary = 0b01000001; // 2진수
    var octal = 0o101; // 8진수
    var 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
    
  • 숫자 타입의 세 가지 특별한 값
    1
    2
    3
    
    console.log(10 / 0); // Infinity
    console.log(10 / -0); // -Infinity
    console.log(1 * "String"); // NaN
    
    • Infinity
      • 양의 무한대
    • -Infinity
      • 음의 무한대
    • NaN
      • 산술 연산 불가

6.2 문자열 타입

  • 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합
    • 유니코드: 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준
  • 작은따옴표, 큰따옴표, 백틱으로 텍스트를 감싸 표현
    • 작은따옴표를 사용하는 게 가장 일반적
  • 문자열이 생성되면 변경할 수 없다(immutable).

6.3 템플릿 리터럴

  • ES6부터 도입
  • 멀티라인 문자열, 표현식 삽입, 태그트 템플릿 등의 편리한 문자열 처리 기능 제공
  • 런타임에 의해 일반 문자열로 변환되어 처리
  • 백틱을 사용해 표현

6.3.1 멀티라인 문자열

  • 일반 문자열에서는 줄바꿈(개행)이 허용되지 않아 이스케이트 시퀸스를 사용해야 한다.
    1
    2
    3
    
    var str = 'Hello
    world.';
    // SyntaxError: Invalid or unexpected token
    
  • 템플릿 리터럴에서는 줄바꿈이 작성된 그대로 적용된다.

    1
    2
    3
    4
    5
    
    var template = `<ul>
      <li><a href="#">Home</a></li>
    </ul>`;
    
    console.log(template);
    
    1
    2
    3
    4
    5
    6
    7
    
    // console.log(template); 결과
    
    <ul>
      <li>
        <a href="#">Home</a>
      </li>
    </ul>
    

6.3.2 표현식 삽입

  • 문자열 연산자 +를 사용해 문자열을 연결할 수 있다.
  • 템플릿 리터럴에서는 표현식 삽입(expression interpolation)을 통해 문자열을 연결할 수 있다.

    1
    2
    3
    4
    5
    
    var first = "Ung-mo";
    var last = "Lee";
    
    // ES6: 표현식 삽입
    console.log(`My name is ${first} ${last}.`); // My name is Ung-mo Lee.
    
  • 표현식 삽입을 위해선 ${ }으로 표현식을 감싸야 한다.
  • 표현식의 평가 결과는 무조건 문자열로 변환된다.

6.4 불리언 타입

    • true
  • 거짓
    • false

6.5 undefined 타입

  • var 키워드로 선언한 변수는 undefined로 초기화된다.
    • 즉 참조 시 undefined를 반환하는 변수는 값이 할당된 적 없는(초기화되지 않은) 변수이다.
  • 의도적으로 undefined를 할당하는 건 권장되지 않는다.

6.6 null 타입

  • 변수에 값이 없다는 것을 의도적으로 명시
    • 의도적 부재(internal absence)
  • 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거
  • 함수가 유효한 값을 반환할 수 없는 경우에도 명시적으로 null 반환

6.7 심벌 타입

  • ES6에서 도입
  • 변경 불가능한 원시 타입의 값
  • 다른 값과 중복되지 않는 유일무이한 값
    • 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만드는 데 사용
  • 리터럴을 통해 생성되는 다른 원시 값과 달리 Symbol 함수를 통해 호출

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    // 심벌 값 생성
    var key = Symbol("key");
    console.log(typeof key); // symbol
    
    // 객체 생성
    var obj = {};
    
    // 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
    obj[key] = "value";
    console.log(obj[key]); // value
    
  • 생성된 심벌값은 외부에 노출되지 않음

6.8 객체 타입

  • 자바스크립트는 객체 기반의 언어이다.
  • 자바스크립트를 이루는 거의 모든 것이 객체이다.

6.9 데이터 타입의 필요성

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

  • 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
    • 자바스크립트 엔진은 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보
    • ECMAScript 사양은 문자열과 숫자 타입의 데이터 타입만을 명시하기에 나머지 타입이 확보하는 메모리 공간은 자바스크립트 엔진 제조사에 따라 달라진다.
  • 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
    • 데이터 타입에 따라 메모리 공간에 저장된 값을 몇 바이트 읽어들일지 결정
    • 잘못된 단위로 읽는다면 값이 훼손된다.

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

  • 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
    • 0100 0001은 숫자로 65이지만 문자열로 ‘A’ 이다.

6.10 동적 타이핑

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

정적 타입 언어

  • static/strong type 언어
  • 변수를 선언할 때 할당할 수 있는 값의 데이터 타입을 함께 선언해야 한다.
    • 명시적 타입 선언(explicit type declaration)
  • 컴파일 시점에 타입 체크를 수행하고, 이를 통과하지 못하면 에러가 발생한다.
  • 타입의 일관성을 강제해 안정적인 코드를 구현하도록 해 런타임에 발생하는 에러를 줄인다.
  • C, C++, 자바, 코틀린, 고, 하스켈, 러스트, 스칼라 등

동적 타입 언어

  • dynamic/weak type 언어
  • 자바스크립트 변수는 선언이 아닌 할당에 의해 타입이 결정된다.
    • 타입 추론(type inference)
  • 재할당에 의해 변수의 타입은 동적으로 변할 수 있다.
    • 동적 타이핑(dynamic typing)
    • 자바스크립트는 동적 타입 언어이다.
  • 자바스크립트, 파이썬, PHP, 루비, 리스크, 펄 등

6.10.2 동적 타입 언어와 변수

  • 동적 타입 언어는 유연성이 높지만, 신뢰성이 떨어진다.
  • 안정적인 프로그램을 위한 변수 사용 주의 사항
    • 변수는 필요한 만큼 최소한으로 유지한다.
    • 변수의 유효 범위(스코프)를 최대한 좁게 만들어 부작용을 최소화한다.
    • 전역 변수는 최대한 사용하지 않는다.
    • 변수보다는 상수를 사용한다.
    • 변수의 이름은 목적이나 의미를 파악할 수 있도록 네이밍한다.
This post is licensed under CC BY 4.0 by the author.