코어 자바스크립트 (데이터 타입)

LeeJaeHoon·2022년 3월 29일
0
post-thumbnail

1. 데이터 타입

01 데이터 타입의 종류

자바스크립트의 데이터 타입에는 크게 두가지가 있다.

  1. 기본형(primitive type)
    • Number
    • String
    • Boolean
    • null
    • undefined
    • Symbol
  2. 참조형(Reference type)
    • Array
    • Function
    • Data
    • RegExp
    • Map, WeakMap
    • Set, WeakSet

어떠한 기준으로 기본형과 참조형을 구분할까

  1. 기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제합니다.

02 기본형은 불변성을 띈다

기본형인 숫자 10을 담은 변수 a에 다시 숫자 15를 담으면 a의 값은 문제 없이 15로 변하는데 ‘변하지 않는다’는 게 어떤 의미일까요?

a에 10을 할당한 후 15를 다시 할당한다고 해봅시다.

let a = 10; //(1)
a = 15; //(2)

(1)의 동작원리를 간단히 살펴보면

1) 변수 영역에서 빈 공간(@1003)를 확보합니다.

2) 확보한 공간의 식별자를 a로 지정합니다.

3) 데이터 영역의 빈 공간(@5004)에 숫자 10을 저장합니다.

4) 변수 영역에서 a라는 식별자를 검색합니다.(@1003)

5) 앞서 저장한 숫자 10의 주소(@5004)를 @1003의 공간에 대입합니다.

자바스크립트는 왜 변수 영역에 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거치는 걸까요??

이는 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효과적으로 관리하기 위한 결과입니다.

만약 미리 확보한 공간 내에서만 데이터 변환을 할 수 있다면 변환한 데이터를 다시 저장 하기 위해서는 ‘확보된 공간을 변환된 데이터 크기에 맞게 늘리는 작업’이 선행되야 합니다. 해당 공간이 메모리 상의 중간있고 데이터를 늘려야 하는 상황이 오면 해당 공간보다 뒤에 저장된 데이터들을 전부 뒤로 옮기고, 이동시킨 주소를 각 식별자에 다시 연결을 해야합니다. 결국 효율적으로 데이터의 변환을 처리하려면 변수와 데이터를 별도의 공간에 나누어 저장하는 것이 최적입니다.

이제 (2)의 동작원리를 살펴볼까요?? (1)과 같이 새로운 데이터 영역에 숫자 15를 저장하고 a라는 식별자를 검색한후 숫자 15의 주소를 a식별자가 있는 변수영역에 저장합니다.

이러한 과정을 통해 알 수 있듯이 기존 숫자를 다른 숫자로 바꿀려할때 무조건 새로 데이터 영역을 확보하여 별도의 공간에 저장합니다. 결국 10과 15 모두 다른 값으로 변경할 수 없습니다. 이러한 이유때문에 기본형은 불변성을 띈다는 겁니다.

03 참조형은 무조건 가변성일까?

참조형은 어떤 동작원리로 데이터가 할당 될까요?? 다음 예시를 통해 알아봅시다.

let obj1 = {
	a: 1,
	b: 'bbb'
};

1) 컴퓨터는 우선 변수 영역의 빈 공간(@1002)을 확보하고, 그 주소의 이름을 obj1로 지정합니다.

2) 임의의 데이터 저장 공간(@5001)에 데이터를 저장하려고 보니 여러 개의 프로퍼티로 이뤄진 데이터 그룹입니다. 이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고 그 영역의 주소(@7103 ~ ?)를 @5001에 저장합니다.

3) @7103 및 @7104에 각각 a와 b라는 프로퍼티 이름을 지정합니다.

4) 데이터 영역에서 숫자 1을 검색합니다. 검색 결과가 없으므로 임의로 @5003에 저장하고, 이 주소를 @7103에 저장합니다. 문자열 ‘bbb’ 역시 임의로 @5004에 저장하고, 이 주소를 @7104에 저장합니다.

기본형 데이터와의 차이는 ‘객체의 변수(프로퍼티) 영역’이 별도로 존재한다는 점입니다.

다른 예시를 알아 봅시다.

let obj1 = {
	a: 1,
	b: 'bbb'
};
let obj2 = obj1;
obj2.a = 2;

위의 예시는 어떻게 동작할까요? obj1을 할당할때는 위에 적어둔 과정처럼 동작한 후

obj2를 저장하기 위한 새로운 변수 영역을 찾은 뒤 식별자를 obj2로 하고 obj1과 똑같은 주소인 (@7103 ~ ?)을 저장합니다.

이러한 상태에서 obj2.a = 2를 한다면 어떻게 될까요??

식별자 obj2에 저장된 값을 본뒤 주솟값(@7103 ~ ?)인 것을 알고 해당 주소를 찾아갑니다.

해당 주소에서 식별자 이름이 a인것을 찾은뒤(@7103) 새로운 데이터 영역(@5005)에 2를 저장한 후 해당 데이터 영역의 주솟값을 (@7103)에 저장합니다.

변수 영역인 식별자 a에 저장된 주솟값이 달라진 것 이외에는 달라진게 없습니다. 즉 obj1과 obj2는 같은 주솟값을 저장하고 있다는 얘기입니다.

즉 참조형 데이터일때 그 내부의 프로퍼티를 변경할 시 가변값이 됩니다.

하지만 데이터 자체를 변경하고자 하면 기본형 데이터와 마찬가지로 기존 데이터는 변하지 않습니다.

0개의 댓글