javascript 데이터 타입

gyujae·2022년 8월 28일
0

데이터 타입 (Date Type)

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

JavaScript의 데이터 타입 종류

  • 원시 타입 (Primitive data type) : 원시 타입의 값은 변경 불가능한 값 (immutable value)이며 pass-by-value(값에 의한 전달) 이다.

      1. String
      2. Number
      3. Boolean
      4. null
      5. undefined
      6. symbol (ES6에서 추가됨)
  • 객체 타입 (object / reference type)

      1. Object
      2. Array

데이터 타입

기본형(원시 타입, Primitive Type): 숫자(Number), 문자열(String), 불리언(Boolean), null, undefined, 심볼(Symbol)

참조형(Reference Type): 객체(Object)
배열(Array), 함수(Function), 날짜(Date), 정규표현식(RegExp), Map, WeakMap, Set, WeakSet

메모리와 데이터

1바이트는 8개의 비트로 구성되어 있다.
1비트는 0과 1 두 가지 숫자로 표현되며, 1바이트는 256(2^8)개의 값을 표현할 수 있다.

자바스크립트는 다른 언어에 비해 상대적으로 메모리 관리에 대한 압박에서 자유로워졌다.
모든 데이터는 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.

식별자와 변수

변수 는 변할 수 있는 무언가를 말한다. 여기서 '무언가'는 데이터이다.

식별자 는 어떤 데이터를 식별하는데 사용하는 이름, 즉 변수명이다.

기본형 데이터와 참조형 데이터

불변값

변수(variable)와 상수(constant)를 구분하는 성질은 '변경 가능성'이다.
바꿀 수 있으면 변수, 바꿀 수 없다면 상수이다.
변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다.
한 번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재 할당할 수 있는지 여부가 관건이다.

반면, 불변성 여부를 구분할 때의 변경 가능성 대상은 데이터 영역 메모리이다.
기본형 데이터인 숫자, 문자열, boolean, null, undefined, Symbol은 불변값이다.

위의 예제에서 언급했듯이 'abc'와 'abcdef'는 같은 데이터 영역이 아닌 다른 영역에 존재한다.
식별자가 가리키는 데이터 영역이 바뀌었을 뿐, 데이터 영역 자체의 값은 변하지 않았다.

가변값

그렇다면 참조형 데이터는 모두 가변값일까?
기본적인 성질은 가변값인 경우가 많지만 설정에 따라 변경 불가능한 경우도 있고, 아예 불변값으로 활용하기도 한다.

기본형 데이터와의 차이는 객체의 변수 영역이 별도로 존재한다는 것이다.
데이터 영역에 저장된 값들은 모두 불변값이지만, 변수 영역의 값에는 다른 값을 대입할 수 있다.
따라서 참조형 데이터는 불변하지 않다(가변값이다)라고 한다.

불변 객체

먼저 불변(immutability)이란 뭘까? 단어에서 유추해볼 수 있다시피 '변하지 않는' 뜻이라고 생각하면 되겠다.

그럼 '불변 객체'란? '변하지 않는 객체' 즉 이미 할당된 객체가 변하지 않는다는 뜻을 가지고 있다.

자바스크립트에서 불변 객체를 만들 수 있는 방법은 기본적으로 2가지 인데 const와 Object.freeze()를 사용하는 것이다.

const

자바스크립트 키워드 중 하나인 const이다. ES6문법부터 let과 const를 지원한다.

const 키워드는 변수를 상수로 선언할 수 있다, 일반적으로 상수로 선언된 변수는 값을 바꾸지 못하는 것으로 알려져 있다.

Object.freeze()

자바스크립트에서 기본적으로 제공하는 메소드인 Object.freeze() 메소드이다. 공식 문서에서는 "객체를 동결하기 위한 메소드" 라고 적혀있다.

let test = {
    name : 'kim'
}

Object.freeze(test);

사용법은 간단하다. test 변수에 key value를 가진 객체를 바인딩 후 Object.freeze(test)를 사용해 바인딩된 변수를 동결 객체로 만들었다. 때문에 test 객체는 객체의 속성을 변경하는 시도는 불가능하다.
그러나 Object.freeze()는 동결된 객체를 반환하지만 객체의 재할당은 가능하다.

undefined && null

undefined은 변수를 선언하고 값을 할당하지 않은 상태, null은 변수를 선언하고 빈 값을 할당한 상태(빈 객체)이다. 즉, undefined는 자료형이 없는 상태이다.
따라서 typeof를 통해 자료형을 확인해보면 null은 object로, undefined는 undefined가 출력되는 것을 확인할 수 있다.

typeof null // 'object'
typeof undefined // 'undefined'
null === undefined // false
null == undefined // true
null === null // true
null == null // true
!null // true
isNaN(1 + null) // false
isNaN(1 + undefined) // true

undefined

undefined는 원시값(Primitive Type)으로, 선언한 후에 값을 할당하지 않은 변수나 값이 주어지지 않은 인수에 자동으로 할당된다. 이 값은 전역 객체의 속성 중 하나로, 전역 스코프에서의 변수이기도 하다. 따라서 undefined 변수의 초기 값은 undefined 원시 값이다.

  • 값을 할당하지 않은 변수
  • 메서드와 선언에서 변수가 할당받지 않은 경우
  • 함수가 값을 return 하지 않았을 때

null

null은 원시값(Primitive Type) 중 하나로, 어떤 값이 의도적으로 비어있음을 표현한다. undefined는 값이 지정되지 않은 경우를 의미하지만, null의 경우에는 해당 변수가 어떤 객체도 가리키고 있지 않다는 것을 의미한다.

알아두면 좋은 것

  • typeof undefined는 출력하면 undefined이다.
  • typeof null은 출력하면 object이다. 하지만 이는 여전히 원시 타입(primitive value)로, JavaScript에서는 구현 버그로 간주한다.
  • undefined == null은 true이다.

0개의 댓글