[JavaScript] 모던 자바스크립트 Deep Dive로 배우는 JS #6 데이터 타입(2)

ChilihC·2022년 4월 9일
0
post-thumbnail

TIL(Today I Learned) 🧑🏻‍💻


6. 데이터 타입(2)


자바스크립트(ES6)는 7개의 데이터 타입을 제공한다. 7개의 데이터 타입은 원시 타입(primitive type)과 객체 타입(object type)으로 분류할 수 있다.

6.6  null 타입

  • null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재, intentional absence)할 때 사용한다.

  • null은 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미다. 이는 이전에 할당되어 있던 값에 대한 참조를 명시적으로 제거하는 것을 의미하며, 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행할 것이다.


6.7  심벌 타입

  • 심벌(symbol)은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다.

  • 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.

  • 심벌 이외의 원시 값은 리터럴을 통해 생성되지만, 심벌은 Symbol 함수를 호출해 생성한다.

// 심벌 값 생성
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진수를 어떻게 해석할지에 대한 문제가 남아있다. ( ex. '0100 0001'은 숫자로 65이지만 문자열로 해석하면 A이다. )

  • 따라서 이를 해석하기 위해서는 데이터 타입의 명시가 필요하다.

  • 따라서 자바스크립트에서 데이터 타입이 필요한 이유는 다음과 같다.

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

6.10  동적 타이핑

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

  • 정적 타입(static/strong type)언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언(explicit type declaration)이라 한다. ( ex. C, C++, Java ... )

  • 정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다.

  • 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.

  • 자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않으며 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.

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); // boolean

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
  • 자바스크립트에서는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지 자유롭게 변경할 수 있다.

  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론, type inference)된며, 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑(dynamic typing)이라 하며 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입(dynamic/weak tpye)언어라 한다. ( ex. JS, Python, PHP, Ruby ... )

6.10.2  동적 타입 언어와 변수

  • 동적 타입 언어는 변수에 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있다는 장점이 있지만 이에 대한 단점도 존재한다.

  • 동적 타입 언어에서는 변수 값이 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다.

  • 동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.

  • 동적 타입 언어는 유연성(flexibility)은 높지만 신뢰성(reliabilty)은 떨어진다.


새로운 용어 정리


  • 심벌 테이블(symbol table): 컴파일러 또는 인터프리터는 심벌 테이블 이라고 부르는 자료 구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리한다.

  • 트레이드오프(trade-off): 두 개의 정책이나 목표 중 하나를 달성하려고 하면 다른 목표의 달성이 늦어지거나 희생되는 모순적 관계

  • 은 탄환(sliver-bullet): 고질적인 문제를 단번에 해결할 수 있는 명쾌한 해결책


참고 문헌


* 모던 자바스크립트 Deep Dive ( 자바스크립트의 기본 개념과 동작 원리 ) / 이웅모 지음

profile
developer junior

0개의 댓글