[모던 자바스크립트 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.