데이터 타입(Data Type)

2022-03-08 · 2 min read

요약

데이터 타입이란 프로그래밍에서 여러 종류의 데이터를 식별하기 위한 분류입니다.

JavaScript는 동적 타입 언어로, 변수의 타입이 고정되지 않으며 모든 타입의 값으로 할당 및 재할당이 가능합니다.

JavaScript의 데이터 타입은 크게 원시 타입과 객체 타입으로 나뉩니다.

  • 원시 타입은 변경할 수 없는 값을 갖는 타입이며, 숫자, 문자열, 불리언 등이 포함됩니다.
  • 원시 타입이 아닌 모든 값은 객체 타입이며, 변수에 할당할 때 원시 타입은 값 자체를 저장하는 반면, 객체 타입은 실제 객체 데이터를 저장하는 메모리의 주소(참조 값)를 저장합니다.

데이터 타입

프로그래밍에 있어 데이터 타입(Data type), 또는 타입(Type) 이란 정수, 실수, 문자 등 여러 종류의 데이터를 식별하기 위한 분류입니다.

타입을 통해 식별할 수 있는 정보는 다음과 같습니다.

  • 데이터의 의미
  • 해당 타입에 가능한 값
  • 해당 타입을 통해 수행할 수 있는 연산
  • 데이터가 메모리에 저장되는 방식
  • 데이터를 메모리에서 참조하는 방식

JavaScript의 데이터 타입

C, C++, Java와 같은 정적 타입(static type) 언어는 변수를 선언할 때 타입을 명시적으로 선언합니다.

int num = 5; // 정수 타입
boolean bool = true; // 불리언 타입

정적 타입 언어는 변수의 타입을 변경할 수 없고, 선언한 타입의 값만 할당할 수 있습니다. 또한 컴파일 시점에서 타입 체크를 수행하는데, 만약 선언한 타입에 맞지 않는 값을 할당했다면 에러를 발생시킵니다.

반면 JavaScript는 동적 타입(dynamic type) 언어입니다. JavaScript의 변수는 선언 시에 타입을 지정하지 않으며, 모든 타입의 값으로 할당 및 재할당이 가능합니다. 즉 변수 선언 시에 타입을 결정하는 정적 타입 언어와 달리 동적 타입 언어는 값을 할당할 때 타입이 결정됩니다.

let num = 5;
console.log(num); // 5
num = 'string';
console.log(num); // string

JavaScript의 데이터 타입은 크게 원시 타입(primative type)객체 타입(object type) 으로 나뉩니다.

원시 타입

원시 타입이란 변경할 수 없는 값(immutable value, 불변 값) 을 갖는 기본적인 타입을 말한다. JavaScript는 현재(ES11~) 7개의 원시 타입이 존재합니다.

  • number: 숫자 타입. 정수와 실수를 구분하지 않으며 기본적으로 배정밀도 64비트 이진 형식의 값을 갖습니다. 숫자 값 이외에도 Infinity-Infinity(양의 무한, 음의 무한), NaN(Not a Number)이라는 특별한 세 가지 값을 갖습니다.
  • string: 문자열 타입. 텍스트 데이터를 나타내기 위해 사용합니다. 문자열이란 문자의 집합이며 하나의 문자는 16비트 부호 없는(unsigned) 정수 값입니다.
  • boolean: 논리적인 참/거짓을 나타내기 위한 타입. true, false 두 개의 값을 갖습니다.
  • undefined: 값을 할당하지 않은 변수를 나타내기 위한 타입. undefined 타입은 undefined 값 하나만을 갖습니다. JavaScript 엔진은 기본적으로 값을 할당하지 않은 변수를 undefined로 초기화합니다.
  • null: undefined가 JavaScript 엔진에 의해 '값이 할당되지 않음'을 나타내기 위한 타입이라면, null은 개발자가 명시적으로 '값이 없음'을 나타내기 위한 타입입니다. null 타입은 null 값 하나만을 갖습니다.
  • symbol: ES6에서 추가. 고유하고 변경 불가능한 원시 값을 갖는 타입. 객체의 프로퍼티 키로 사용합니다.
  • bigint: ES11에서 추가. 임의 정밀도(arbitrary-precision)의 정수 타입. number 타입에서는 오차가 발생하는 큰 수도 안전하게 저장하고 연산할 수 있습니다. 정수 끝에 n을 붙여 값을 표현합니다. (예: 9007199254740992n)

숫자나 문자열을 변경할 수 없다는 데에 조금 의아할 수 있습니다. 하지만 일반적으로 변수의 값을 변경한다고 하는 것은, 실제로 값 자체를 변경하는 것이 아니라 변수에 새로운 값을 할당하는 것입니다.

let a = 5; // a에 숫자 타입의 값 5를 할당한다
a += 10; // a의 값과 10을 + 연산하여 생성한 값을 a에 할당한다

let b = 'string'; // b에 문자열 타입의 값 string을 할당한다
b[3] = 'o'; // 직접 문자열을 변경하려 해도 불가능하다
b = b.slice(0, 3); // b 문자열의 0번째 ~ 3번째 이전까지의 문자로 새로운 문자열을 만들어 b에 할당한다

객체 타입

원시 타입이 아닌 모든 값은 객체 타입으로, 객체 타입은 원시 타입과 근본적으로 다릅니다.

  • 원시 타입의 값은 변경할 수 없지만(immutable) 객체는 변경 가능(mutable)합니다.
  • 원시 타입의 값은 고정된 크기의 데이터를 저장하는 스택(Stack) 메모리에 저장됩니다. 반면에 객체 타입의 값은 동적으로 크기가 변할 수 있는 데이터를 저장하는 힙(Heap) 메모리에 저장되며, 이 객체의 참조 값(메모리 주소)이 스택에 저장됩니다.
  • 비교문에서 원시 타입은 값 자체를 비교합니다. 반면 객체 타입은 값 자체가 아닌 참조값을 비교합니다.
  • 원시 타입은 함수 호출이 끝나면 자동으로 메모리에서 해제됩니다. 반면 힙 메모리에 저장되는 객체 타입은 참조하는 변수가 없을 때 가비지 컬렉터에 의해 해제됩니다.

참고 자료

Copyright 2022-2024.hanse-kimAll right reserved.