자바스크립트를 제대로 이해하고 활용하기 위해서 데이터 타입을 알아야 한다. 코드의 동작 방식, 예측 가능한 결과, 오류 방지와 깊은 관련이 있기 때문이다.
자바스크립트는 동적 타입 언어이다. 이는 변수의 데이터 타입이 고정되지 않고, 실행 중에 변경될 수 있음 을 의미한다.
let value = 5; // 숫자
value = "hello"; // 문자열
value = true; // 불리언
이러한 유연성은 자바스크립트의 장점이 될 수 있지만, 데이터 타입을 잘못 이해하면 의도하지 않은 동작이 발생할 수 있다.
console.log(5 + "5"); // "55" (숫자가 문자열로 변환되어 연결)
console.log(5 - "2"); // 3 (문자열이 숫자로 변환되어 연산)
데이터 타입을 정확히 이해하면 이러한 예기치 못한 결과를 방지할 수 있습니다.
그렇다면 데이터 타입에는 어떤 종류가 있을까?
자바스크립트의 데이터 타입은 크게 원시 타입(Primitive Type) 과 참조 타입(Reference Type) 으로 나뉜다.
원시 타입은 값이 불변하며, 데이터 자체를 변수에 저장하는 특징이 있다. 자바스크립트에는 7가지 원시 타입이 존재하며, 이를 기본형이라고도 부른다.
string
number
Infinity
, -Infinity
, NaN
도 포함된다.bigint
n
을 붙여 생성한다.const bigNumber = 1234567890123456789012345678901234567890n;
boolean
undefined
undefined
값을 가진다.null
symbol
const uniqueKey = Symbol("key");
const obj = { [uniqueKey]: "value" };
참조 타입은 객체 형태의 데이터를 가리키며, 변수는 실제 데이터를 저장하는 것이 아니라 메모리 주소(참조값) 가 저장된다.
object
키-값 쌍으로 데이터를 저장하며, 배열, 함수, 날짜 등 다양한 형태를 포함한다.
array
순서가 있는 데이터의 집합으로, 요소는 어떤 데이터 타입이든 가능하다.
function
함수도 객체의 한 종류로 취급된다.
date
날짜와 시간을 다루기 위한 객체이다.
const now = new Date();
const map = new Map();
map.set("key", "value");
let obj1 = { name: "Alice" };
let obj2 = obj1; // obj1의 참조 주소를 복사
obj2.name = "Bob"; // obj1.name도 "Bob"으로 변경
let arr = [1, 2, 3];
arr.push(4); // 기존 배열에 4를 추가, 메모리 주소는 동일
let obj1 = { key: "value" };
let obj2 = obj1;
obj2.key = "new value"; // obj1.key도 "new value"로 변경
자바스크립트의 데이터 타입은 기본형과 참조형으로 나뉘며, 두 타입의 저장 방식과 동작 원리는 명확히 구분된다.
기본형: 값 자체가 저장되며, 변수에 값이 직접 할당된다.
참조형: 변수에는 값 자체가 아닌 메모리 주소(참조값)가 저장된다.
let a = 10;
let b = a; // b는 a와 독립적으로 값 10을 가짐
b = 20;
console.log(a); // 10
let obj1 = { key: "value" };
let obj2 = obj1; // obj2는 obj1의 참조값을 복사
obj2.key = "new value";
console.log(obj1.key); // "new value"
참조형 데이터는 객체의 변수 영역이 별도로 존재한다는 특징이 있다.
데이터 영역: 실제 값이 저장된 기존의 메모리 공간을 그대로 활용하며, 이 값은 불변성을 가진다.
변수 영역: 객체가 별도로 할당한 공간으로, 이 영역에서 다른 값을 대입하거나 참조를 변경할 수 있다.
따라서 참조형 데이터는 데이터를 직접 수정하지 않아도 변수 영역에서 다른 값을 가리킬 수 있어 흔히 가변값이라고 불린다.
let obj = { key: "value" };
obj.key = "new value"; // 기존 데이터를 수정
obj = { key: "another value" }; // 새로운 객체를 참조
기본형: 값이 불변하며, 수정 시 새로운 메모리 공간이 할당된다.
참조형: 변수 영역에서 참조를 변경하거나 데이터 자체를 수정할 수 있어 가변적이다.