Primitive Type, Null과 undefined

undefined와 null 둘 다 Primitive Type(원시 타입)입니다.
우선 Primitive Type이 무엇인지 알아보고 이 둘의 차이점을 보겠습니다.

Primitive Type

다른 언어와 마찬가지로 JavaScript의 언어 타입도 크게 Primitive Type(원시 타입)과 Reference Type(참조 타입)으로 나뉩니다. 이 둘은 메모리에 저장되는 방식에 따라 나뉩니다.

Primitive Type과 Reference Type의 차이점은

  1. Premitive Type은 실제 데이터 값을 저장하고 Reference Type은 객체의 번지 주소를 저장해 메모리 번지 값을 통해 객체를 참조하는 타입입니다.
  2. Premitive Type은 변경 불가능한 Immutable Type이고, Reference Type은 변경이 가능한 가변성을 가진 mutable type입니다.

1번처럼 구분되는 이유는 사전에 얼만큼의 메모리를 할당할 수 있는지 알 수 있는 여부 때문입니다. 이걸 이해하기 위해서는 JavaScript나 Python 같은 동적 언어보다는 Java나 C 같은 정적 언어로 생각하면 편합니다.(동적 언어와 정적 언어의 설명은 아래 링크로 보면 이해되실 겁니다.) Java에서 Primitive Type인 정수는 4바이트 크기의 빈 방을 스택 메모리에 생성해서 사용합니다. 그래서 -2,147,483,648 ~ 2,147,483,647 사이의 정수만 입력이 가능합니다. 4바이트로 표현할 수 있는 숫자까지 저장할 수 있는 것입니다. 그래도 이렇게 Primitive Type의 경우 사전에 할당하는 메모리 크기를 정할 수 있는 자료형들입니다. 그래서 상대적으로 적은 용량이지만 액세스 속도가 매우 빠른 스택 메모리에 저장할 수 있는 것입니다. 하지만 만약 Reference Type인 객체를 저장한다고 하면 사전에 크기를 정하기 어렵습니다. 무작정 큰 저장 용량을 할당한다면 사용하지 않는 공간이 많아 메모리를 낭비할 수도 있고, 작은 저장 용량을 할당한다면 메모리가 부족해질 수도 있습니다. 그래서 액세스 속도가 느리지만 메모리 크기 제한이 상대적으로 여유로운 힙 메모리에 Reference Type을 저장합니다. 정확하게 Reference Type은 힙 메모리에 실제 데이터가 저장되어 있고 Stack메모리에는 Heap메모리의 주소가 저장되어 있습니다. 그래서 객체 번지 주소를 저장하는 것이죠. 이 설명이 자바스크립트에서도 크게 다르지 않습니다.

Primitive Type 종류

  • Boolean 타입
  • Undefined 타입
  • Null 타입
  • Number 타입
  • BigInt 타입
  • String 타입
  • Symbol 타입

이러한 타입이 있고 이 중, Undefined 타입과 Null 타입에 대해 더 알아보겠습니다.

Undefined

undefined는 Primitive Type으로 선언한 후에 값을 할당하지 않은 변수나 값이 주어지지 않은 인수에 자동으로 할당됩니다.

let a;
console.log(a);
//--==>> undefined

이렇게 선언만 하고 할당을 하지 않을 경우는 undefined가 출력됩니다. 즉, undefined는 자료형이 정의되지 않았을 때의 상태입니다. 그래서 변수가 undefined라면 아직 변수에 값이 할당되지 않았음을 의미합니다.

Null

null도 Primitive Type으로 이전에 값은 할당되었었지만 값이 더이상 유효하지 않음을 나타낼 때 사용합니다.

let b = 3;
b = null;
console.log(b);
//--==>> null

이 예시처럼 변수 b가 더이상 기존 값(3)이 유효하지 않음을 의미합니다. null은 변수를 초기화할 때 사용합니다.

참고로 undefined == null은 true이지만, undefined === null은 false 입니다. 이를 통해서도 이 둘은 자료형이 각각 undefined과 null로 다르다는 것을 알 수 있습니다.

'JavaScript > JavaScript' 카테고리의 다른 글

Named Function Expression(기명 함수 표현식)  (0) 2023.04.11
BigInt  (0) 2023.04.09
Event Bubbling과 화살표 함수  (0) 2022.12.12
자바스크립트 문자열 객체  (0) 2022.07.22
자바스크립트 배열 객체  (0) 2022.07.22