JavaScript 데이터 타입
데이터 타입(Data Type)은 프로그래밍 언어에서 사용 가능한 데이터의 종류를 의미합니다. JavaScript의 모든 값은 데이터 타입을 갖게 되는데 ECMAScript(ES6) 기준으로 다음과 같이 7개의 데이터 타입이 제공됩니다.
- 원시 타입(Primitive Type)
- number
- string
- boolean
- undefined
- null
- symbol (ES6) - 객체/참조 타입(Object/Reference Type)
- object
1. 원시 타입(Primitive Type)
원시 타입의 값은 변경 불가능한 값(Immutable Value)이며, 값에 의한 전달(pass-by-value)이 이루어집니다.
1.1. number
JavaScript에서는 C, Java와는 다르게 하나의 숫자 타입만 존재합니다. 정수만을 위한 타입은 없고 모든 수를 실수로 처리합니다. 2진수, 8진수, 16진수와 같은 진수 리터럴은 10진수로 해석되어 반환됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
let integer = 1;
let double = 1.23;
let negative = -10;
let binary = 0b01000001;
let octal = 0o101;
let hex = 0x41;
console.log(integer); // 1
console.log(double); // 1.23
console.log(negative); // -10
console.log(binary); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary === octal); // true
console.log(octal === hex); // true
|
cs |
앞서 설명했듯이 JavaScript의 number 타입은 모든 수를 실수로 처리하기 때문에 다음과 같이 정수로 나누더라도 실수로 반환될 수 있습니다.
1
2
3
|
console.log(1 === 1.0); // true
console.log(4 / 2); // 2
console.log(3 / 2); // 1.5
|
cs |
유효하지 않은 숫자에 대해서는 다음과 같이 NaN(Not a Number)을 반환합니다. 또한 전역 객체의 isNan() 메서드를 이용하여 NaN 여부를 판별할 수 있습니다.
1
2
3
4
5
6
|
let a = 0;
let b = 0;
let c = a / b;
console.log(c); // NaN
console.log(isNaN(c)); // true
|
cs |
무한대 표현도 제공하는데 양의 무한대는 Infinity, 음의 무한대는 -Infinity를 반환합니다. 또한 전역 객체의 isFinite() 메서드는 숫자값의 유한 여부를 판별합니다.
1
2
3
4
5
6
|
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
console.log(isFinite(1 / 0)); // false
console.log(isFinite(NaN)); // false
console.log(isFinite(1)); // true
|
cs |
1.2. string
문자열(string) 타입은 텍스트 데이터를 표현하기위해 사용합니다. UTF-16 문자들의 집합으로 Single Quotation(') 또는 Double Quotation(") 안에 텍스트를 작성하여 생성합니다. 또한 문자열은 유사배열이라서 배열처럼 인덱스를 이용하여 접근이 가능합니다.
1
2
3
4
5
|
let str = 'Harry';
for (let i=0; i<str.length; i++) {
console.log(str[i]);
}
|
cs |
원시 타입인 문자열은 한 번 생성하고 나면 read only로 동작하여 변경이 불가능(Immutable) 합니다. 따라서 문자열을 수정하면 새로운 문자열이 생성되어 할당됩니다.
1
2
3
4
5
|
let str = 'Harry';
console.log(str); // Harry
str += ' Potter';
console.log(str); // Harry Potter
|
cs |
1.3. boolean
boolean 타입은 논리적으로 참, 거짓을 나타내는 true 와 false 만을 값으로 갖습니다. 프로그램의 흐름을 제어하는 조건문에 자주 사용하며 0, null, undefined, NaN, false, 빈 문자열('')은 false로 간주됩니다.
1
2
3
4
5
|
let boolean1 = true;
let boolean2 = false;
console.log(typeof boolean1); // boolean
console.log(typeof boolean2); // boolean
|
cs |
1.4. undefined
undefined 타입은 undefined 만을 유일한 값으로 갖습니다. 변수 선언 이후에 값이 할당되지 않았거나 객체의 존재하지 않는 프로퍼티에 접근했을 경우 undefined가 반환됩니다.
1
2
|
let val;
console.log(val); // undefined
|
cs |
undefined 값은 의도적으로 할당한 값이 아닌 JavaScript 엔진에 의해 초기화된 값입니다. 의도적으로 값이 없음을 명시하기 위해서 undefined를 할당할 수는 있지만 undefined 본래의 취지와 어긋나고 혼란을 줄 수 있기 때문에 권장하지 않습니다. 그러한 경우엔 null을 대신 할당합니다.
1.5. null
null 타입은 null 만을 유일한 값으로 갖습니다. 의도적으로 변수에 값이 없음을 명시하기 위해서 사용하며, 이것은 해당 변수가 참조하고 있는 메모리의 주소값을 삭제하는 것을 의미합니다.
1
2
3
4
|
let str = 'Harry';
console.log(str); // Harry
str = null;
console.log(str); // null
|
cs |
다음과 같이 함수가 호출되었으나 유효한 값을 반환하지 못한 경우에도 null을 반환합니다.
1
2
|
let element = document.querySelector('.element');
console.log(element); // null
|
cs |
변수에 null을 할당한 후 typeof 연산자로 확인해보면 object가 반환됩니다. 따라서 null 타입을 확인할 때는 일치 연산자(===)를 사용해야 합니다.
1
2
3
4
|
let val = null;
console.log(typeof val); // object
console.log(typeof val === null); // false
console.log(val === null); // true
|
cs |
1.6. symbol
symbol 타입은 ES6에서 새로 추가된 타입으로 변경 불가능한 원시 타입의 값을 갖습니다. 객체 프로퍼티의 유일한 키를 만들기 위해 사용됩니다. 생성시 Symbol 함수를 호출하여 중복되지 않는 이름으로 유일한 값을 생성합니다.
1
2
3
4
5
6
|
let key = Symbol('key');
console.log(typeof key); // symbol
let obj = {};
obj[key] = 'value';
console.log(obj[key]); // value
|
cs |
2. 객체/참조 타입(Object/Reference Type)
객체는 데이터와 그 데이터에 관련된 동작(절차, 방법, 기능)을 모두 포함하는 개념입니다. 다시 말해서 property와 method를 모두 포함할 수 있는 독립적인 주체입니다.
JavaScript는 객체 기반의 스크립트 언어로써 원시 타입을 제외한 나머지 값들(배열, 함수, 정규표현식 등)은 모두 객체입니다. 또한 객체는 참조에 의한 전달(pass-by-reference)이 이루어집니다.
이상으로 JavaScript의 데이터 타입에 대해 알아봤습니다.
※ Reference
- poiemaweb.com, 데이터 타입과 변수, https://poiemaweb.com/js-data-type-variable
- insanehong.kr, Javascript기초 - 데이터타입, http://insanehong.kr/post/javascript-datatype/
- velog.io/@surim014, JavaScript - 데이터 타입(Data Type)에 대해 알아보자, https://velog.io/@surim014/%EC%9B%B9%EC%9D%84-%EC%9B%80%EC%A7%81%EC%9D%B4%EB%8A%94-%EA%B7%BC%EC%9C%A1-JavaScript%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-part.2