데이터 타입
자바스크립트 ES6는 7개의 데이터 타입을 제공한다. 7개의 데이터 타입은 원시 타입 → primitive type | 객체 타입 → object type/reference type으로 분류할 수 있다
구분 | 데이터 타입 | 설명 |
---|---|---|
원시 타입 | 숫자 number | 숫자, 정수와 실수 구분 없이 하나의 숫자 타입만 존재 |
문자열string | 문자열 | |
불리언 boolean | 논리적 참(true)과 거짓(false) | |
undefined타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 | |
null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
심벌symbol 타입 | ES6에서 추가된 7번째 타입 | |
객체 타입 | 객체, 함수, 배열 등…. |
6.1 숫자 타입
C나 자바의 경우, 정수(소수점 이하가 없는 숫자)와 실수(소수점 이하가 있는 숫자)를 구분행서 int, long, float, double등 ****과 같은 다양한 숫자 타입을 제공한다. ~→ 하지만 자바스크립트는 독특하게 하나의 숫자 타입만 존재한다.
// 모두 숫자 타입
var integer = 10; // 정수
var double = 10.12; // 실수
var negative = -20; // 음의 정수
정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장된다.
자바스크립트는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입을 제공하지 않기 때문에 이들값을 참조하면 모두 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
자바스크립트의 숫자 타입은 정수만을 위한 타입이 없고 모든 수를 실수로 처리한다고 했다. 이는 정수로 표시된다 해도 사실은 실수라는 것을 의미한다. 따라서 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.
// 숫자 타입은 모두 실수로 처리된다.
console.log(1 === 1.0); // true
console.log(4 / 2); // 2
console.log(3 / 2); // 1.5
숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 있다.
- Infinity: 양의 무한대
- -Infinity: 음의 무한대
- NaN: 산술 연산 불가(not-a-number)
// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(10 / -0); // -Infinity
console.log(1 * 'String'); // NaN
자바스크립트는 대소문자를 구별case-sensitive하므로 NaN을 NAN, Nan, nan과 같이 표현하면 에러가 발생하므로 주의하기 바란다. 자바스크립트 엔진은 NAN, Nan, nan을 값이 아닌 식별자로 해석한다.
var x = nan; // ReferenceError: nan is not defined
6.2문자열 타입
문자열String → 타입은 텍스트 데이터를 나타내는 데 사용한다. 문자열은 0개 이상의 16비트 유니코드 문자(UTF-16)의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.
문자열은 작은따옴표(’’), 큰따옴표(””) 또는 백틱(’’)으로 텍스트를 감싼다 자바스크립트에서 가장 일반적인 표기법은 작은 따옴표를 사용하는 것이다.
var string;
string = '문자열'; // 작은따옴표
string = "문자열"; // 큰 따옴표
string = '문자열'; // 백틱 -> ES6
// 따옴표로 감싸지 않은 hello를 식별자로 인식한다.
var string = hello; // ReferenceError: hello is not defined
6.3 템플릿 리터럴
ES6부터 템플릿 리터럴(template literal) 이라고 하는 새로운 문자열 표기법이 도입되었다.
템플릿 리터럴은 멀티라인 문자열(multi-line string) , 표현식 삽입 expression interpolation, 태그드 템플릿(tagged template)등 편리한 문자열 처리 가능을 제공한다. 템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리된다.
6.3.1 멀티라인 문자열
일반 문자열 내에서는 줄바꿈(개행)이 허용되지 않는다.
var str = 'Hello
world.';
// SyntaxError: Invalid or unexpected token
따라서 일반 문자열 내에서 줄바꿈 등의 공백(white space) 을 표현하려면 백슬래시()로 시작하는 이스케이프 시퀀스(escape sequence)를 사용해야 한다.
이스케이프 시퀀스 | 의미 |
---|---|
\0 | Null |
\b | 백스페이스 |
\f | 폼 피드(Form Feed)→ 프린터로 출력할 경우 다음 페이지의 시작 지점으로 이동한다. |
\n | 개행(CR, Carriage Return) → 커서를 처음으로 이동 |
\t | 탭(수평) |
\v | 탭(수직) |
\uXXXX | 유니코드, 예를 들어 ‘\u0041’은 ‘A’, ‘\uD55C’는 ‘한’ …. |
` | 작은따옴표 |
\” | 큰따옴표 |
\ | 백슬래시 |
라인 피드와 캐리지 리턴
개행(new line) 문자는 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열이다. 개행 무자에는 라인 피드(LF, Line Feed)와 캐리지 리턴(CR, Carriage Return)이 있다….
예를 들어, 줄바꿈과 들여쓰기가 적용된 HTML 문자열은 다음과 같이 이스케이프 시퀀스를 사용해 작성한다.
var template = '<ul>\n\t<li><a href="#">Home</a></li>\n</ul>';
console.log(template);
출력 결과는 →
<ul>
<li><a href="#">Home</a></li>
</ul>
일반 무자열과 달리 템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백도 있는 그대로 적용된다.
var template = '<ul>
<li><a href="#">Home</a></li>
</ul>'
6.3.2 표현식 삽입
문자열은 문자열 연산자 +를 사용해 연결할 수 있다. + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다. 그 외의 경우는 뎃셈 연산자로 동작한다.
var first = 'Ung-mo';
var last = 'Lee';
//ES5: 문자열 연결
console.log('My name is ' + first + ' ' + last + '.'); // My name is Ung-mo Lee.
템플릿 리터럴 내에서는 표현식 삽입expression interpolation을 통해 간단히 문자열을 삽입할 수 있다. 이를 통해 문자열 연산자보다 가독성 촣고 간편하게 문자열을 조합할 수 있다.
var fisrt = 'Ung-mo';
var last = 'Lee';
//ES6: 표현식 삽입
console.log('My name is ${first} ${last}.'); // My name is Ung-mo Lee
표현식 삽입하려면 ${ }으로 표현식을 감싼다.
console.log('1 + 2 = ${1 + 2}'); // 1 + 2 = 3
표현식 삽입은 반드시 템플릿 리터럴 내에서 사용해야 한다. 템플릿 리터럴이 아닌 일반 문자열에서의 표현식 삽입은 문자열로 취급된다.
console.log('1 + 2 = ${1 + 2}'); // 1 + 2 = ${1 + 2)
6.2 불리언 타입
- 불리언 타입의 값은 논리적 참, 거짓을 나타내는 true는 false뿐이다.
var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); // false
Undefined 타입
undefined 타입의 값은 undefined가 유일하다.
변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이뤄질 때까지 빈 상태(대부분 비어 있지 않고 쓰레기 값Garbage value이 들어 있다) 내버려두지 않고 자바스크립트 엔진이 Undefined로 초기화한다.
var food;
console.log(foo);
Null 타입
null 타입의 값은 null이 유일하다. 자바스크립트는 대소문자를 구별하므로 null은 Null, NULL 등과 다르다.
var foo = 'Lee';
// 이전 참조를 제거. foo변수는 더 이상 'Lee'를 참조하지 않는다.
// 유용해 보지는 않는다.변수의 스코프를 좁게 만들어 변수 자체를 재빨리 소멸시키는 편이 낫다.
foo = null;
예: → HTML요소를 검색해 반환하는 document.querySelector 메서드는 조건에 부합하는 HTML요소를 검색할 수 없는 경우 에러 대신 null을 반환한다.
6.7 심벌 타입
심벌 (Symbol)은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. → 따라서 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
// 심벌 값 생성
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 → 데이터 타입에 의한 메모리 공간의 확보와 참조
- 값은 메모리에 저장하고 참조할 수 있어야 한다.
- 메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기를 결정해야 한다.
다시 말해, 몇 바이트의 메모리 공간을 사용해야 낭비와 손실 없이 값을 저장할 수 있는자 알아야 한다.
var score = 100;
위 코드가 실행되면 컴퓨터는 숫자 값 100을 저장하기 위해 메모리 공간을 확보한 다음, 확보된 메모리에 숫자 값 100을 2진수로 저장한다. 이러한 처리를 하려면 숫자 값을 저장할 때 확보해야 할 메모리 공간의 크기를 알아야 한다.
자바스크립트 엔진은 리터럴 100을 숫자 타입의 값으로 해것하고 숫자 타입의 값 100을 저장하기 위해 8비트의 메모리 공간을 확보한다.
그리고 100을 2진수로 저장한다.
0x00000 | ||
---|---|---|
….. | ||
0x000F2 | 00000000 | score |
00000000 | 8바이트 | |
00000000 | ||
00000000 | ||
….. |
데이터 타입에 따라 확보되는 메모리 공간의 크기
ECMAScript 사양은 문자열과 숫자 타입 외의 데이터 타입의 크기를 명시적으로 규정하고 있지는 않다. 따라서 문자열과 숫자 타입을 제외하고 데이터 타입에 따라 확보되는 메모리 공간의 크기는 자바스크립트 엔지 제조사의 구현에 따라 다를 수 있다.
동적 타이핑
→ 6.10.1 동적 타입 언어와 정적 타입 언어
자바스크립트의 모든 값은 데이터 타입을 갖는다고 했다.
C나 자바 같은 정적 타입static/strong type 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언explicit type declaration이라 한다. 다음은 C에서 정수 타입의 변수를 선언하는 예다.
// c 변수에는 1바이트 정수 타입의 값(-128 ~ 127)만 할당할 수 있다.
char c;
// num 변수에는 4바이트 정수 타입의 값( -2,124,483,648 ~ 2,124,483,647)만 할당할 수 있다.
int num;
정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할수 있다.
자바스크립트에서 변수를 하나 선언하고 지금까지 살펴본 다양한 데이터 타입의 값을 할당한 다음 typeof 연산자로 변수의 데이터 타입을 조사해 보자.
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)된다. → 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
'모던 자바스크립트' 카테고리의 다른 글
자바스크립트 객체 리터럴 (0) | 2022.10.14 |
---|