Skip to main content Link Menu Expand (external link) Document Search Copy Copied

데이터 타입

데이터 타입(Data Type)은 프로그래밍 언어에서 사용할 수 있는 데이터(숫자, 문자열, 불리언 등)의 종류를 말합니다.

데이터 타입의 종류

원시 타입 (primitive data type): 변경 불가능한 값(immutable value)이며 값에 의한 전달입니다.

  1. boolean
    • 논리적 참, 거짓을 나타내는 true, false값을 가질 수 있습니다.
    • '', null, undefined, 0false로 간주됩니다.
  2. null
    • 의도적으로 변수에 값이 없다는 것을 명시할 때 사용합니다. 이는 변수가 기억하는 메모리 어드레스의 참조 정보를 제거하는 것을 의미하며 자바스크립트 엔진은 누구도 참조하지 않는 메모리 영역에 대해 가비지 콜렉션을 수행할 것입니다.
    • 함수가 호출되었으나 유효한 값을 반환할 수 없는 경우, 명시적으로 null을 반환하기도 합니다.
      var element = document.querySelector('.myElem');
      // HTML 문서에 myElem 클래스를 갖는 요소가 없다면 null을 반환한다.
      console.log(element); // null
      
    • 타입을 나타내는 문자열을 반환하는 typeof 연산자로 null 값을 연산해 보면 null이 아닌 object가 나옵니다. 이는 자바스크립트의 설계상의 오류입니다. 따라서 null 타입을 확인할 때 일치 연산자(===)를 사용해야 합니다.
  3. undefined
    • undefined 타입의 값은 undefined가 유일합니다.
    • 선언 이후 값을 할당하지 않은 변수는 undefined 값을 가집니다. 즉, 선언은 되었지만 값을 할당하지 않은 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 undefined가 반환됩니다. 이는 변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이루어질 때까지 빈 상태로 내버려두지 않고 js 엔진이 undefined로 초기화하기 때문입니다.
  4. number
    • 모든 수를 실수로 처리하며 정수만을 표현하기 위한 특별한 데이터 타입은 없습니다.
    • 정수로 표시된다해도 사실은 실수입니다. 따라서 정수로 표시되는 수 끼리 나누더라도 실수가 나올 수 있습니다. ``` js console.log(1 === 1.0); // true

var result = 4 / 2; console.log(result); // 2 result = 3 / 2; console.log(result); // 1.5

- `Infinity, -Infinity, NaN: 산술 연산 불가`
``` js
var pInf = 10 / 0;  // 양의 무한대
console.log(pInf);  // Infinity

var nInf = 10 / -0; // 음의 무한대
console.log(nInf);  // -Infinity

var nan = 1 * 'string'; // 산술 연산 불가
console.log(nan);       // NaN
  1. string
    • '’혹은 ““안에 텍스트를 넣어 생성합니다. 가장 일반적인 표기법은 ‘‘를 사용하는 것입니다.
    • 배열처럼 인덱스를 통해 접근할 수 있습니다. 이와 같은 특성을 갖는 데이터를 “유사 배열”이라고 합니다.
    • 하지만 인덱스로 접근하여 문자열의 일부 문자를 변경할 수 없습니다. 원시 타입이기 때문입니다.

객체 타입 (object/reference type)

객체는 데이터와 그 데이터에 관련한 동작(절차, 방법, 기능)을 모두 포함할 수 있는 개념적 존재입니다. 달리 말해, 이름과 값을 가지는 데이터를 의미하는 프로퍼티(property)와 동작을 의미하는 메소드(method)를 포함할 수 있는 독립적 주체입니다.

js는 객체 기반의 스크립트 언어로써 js를 이루고 있는 거의 “모든 것”이 객체입니다. 원시 타입을 제외한 나머지 값들(배열, 함수, 정규표현식 등)은 모두 객체입니다. 또한 객체는 참조에 의한 전달 방식으로 전달됩니다.

심벌 타입

ES6에서 새롭게 추가된 7번째 타입으로 변경 불가능한 원시 타입의 값입니다. 심볼은 주로 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키를 만들기 위해 사용합니다. 심볼은 Symbol 함수를 호출해 생성합니다. 이때 생성된 심볼 값은 다른 심볼 값들과 다른 유일한 심볼 값입니다.

// 심볼 key는 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키
var key = Symbol('key');
console.log(typeof key); // symbol

var obj = {};
obj[key] = 'value';
console.log(obj[key]); // value

데이터 타입이 필요한 이유

코드에서 사용되는 모든 데이터는 메모리에 저장하고 참조할 수 있어야 합니다. 데이터 타입은 데이터를 메모리에 저장할 때 확보해야 하는 메모리 공간의 크기와 할당할 수 있는 유효한 값에 대한 정보, 그리고 메모리에 저장되어 있는 2진수 데이터를 어떻게 해석할 지에 대한 정보를 컴퓨터와 개발자에게 제공합니다.

데이터 타입은 한정된 메모리 공간을 효율적으로 사용하기 위해서, 그리고 메모리에 저장된 2진수 데이터를 다양한 형태로 사용하기 위해 필요합니다.

정적 타이핑

자료형을 컴파일 당시에 결정하는 것으로, 변수에 들어갈 값의 형태에 따라 자료형을 사전에 지정해야 합니다. 컴파일 진행시 자료형에 맞지 않은 값이 전달되면 컴파일 에러를 발생시킵니다. 컴파일 당시에 자료형에 대한 판단을 진행하기 때문에 속도가 빠르며, 타입 에러로 발생하는 문제점을 초기에 발견할 수 있는 장점이 있습니다.

동적 타이핑

js는 동적 타입(dynamic/weak type) 언어입니다. 변수의 타입 지정없이 값이 할당되는 과정, 즉 런타임에 값의 타입에 의해 자동으로 타입이 결정된다는 뜻입니다. 따라서 같은 변수에 여러 타입의 값을 할당할 수 있습니다. 이를 동적 타이핑이라고 합니다. 런타임 당시에 타입에 대한 결정을 진행하므로 프로그래밍 하는 입장에서 편할 수 있지만, 한 편으로는 런타임 동안 예상치 못한 에러가 발생할 수 있고 이를 발견하는데 큰 어려움을 겪을 수 있습니다.