#기본형 데이터
기본형 타입의 종류에는 숫자, 문자열, 불리언, null, undefined, symbol이 있습니다.
일반적으로 기본형은 '할당이나 연산시 데이터가 복제'된다고 알려져있습니다.
#기본형 타입의 저장방식
기본형 데이터는 값을 그대로 할당 합니다.
메모리 내에 고정된 크기로 저장되면서, 원시 데이터 값 자체를 보관, 불변적이고 기본적으로 데이터는 하나의 메모리를 사용한다.
예를 들어 아래와 같다.
- 변수명(a, b, c) 를 만들면 변수를 저장할 비어있는 데이터 영역을 확보한다.
- 변수 a = 313, b = 314, c= 315를 각각 대입한다.
- 기존 변수명을 새롭게 할당하려고 하는 경우, 새로운 변수는 별도의 공간을 확보하고, 불러온 값을 통해 기존 변수에 대입된다.
- 여기다가 b와 c가 같다고 표현을 해보았다. 세상에 b===c가 된다.
- 근데 다시 여기에 c에 20을 대입해보았다.
- 그렇게되면 c는 20이란 데이터값으로 대체 되므로 b와 c는 같은 값이 아니게 되어버린다.
여기서 의문점 데이터 영역에 c에 20을 대입해 변경했을때,
해당 영역의 데이터를 수정하지 않고 왜 새로운 메모리 영역을 사용하는가??
이것을 이해하기위해서는 불변성을 이해해야합니다.
#불변성
단순히 정의만을 말하자면 '변하지 않는 성질'이라고 할 수 있습니다.
하지만 불변성이 해당하는 부분이 어디인지를 확실히 이해해야합니다.
불변성은 변수와 상수의 개념으로 말하는 것이 아닙니다.
변수와 상수는 변수 영역 메모리에 데이터 할당 후 재할당이 되는지에 대한 여부로 구분되는 것이며
불변성은 데이터 영역의 메모리에 대한 것 입니다.
간단하게, 메모리 저장에 대한 이야기를 해보겠습니다.
메모리에 데이터를 저장하기 위해서는 메모리 공간을 선행으로 확보해야합니다.
불변성이 없다고 생각했을때,
처음 저장한 데이터의 크기보다 더 큰 데이터를 또는 다른 데이터를 '재할당' 해야한다면 어떤일이 생길까요?
데이터 공간을 재확보해야하는 일이 생깁니다.
그리고 이 재확보작업을 하게되면 뒤에 저장된 메모리들의 공간이 뒤로 밀리는 현상이 생기고
이 현상으로 인해 각각의 주솟값들을 식별자에 다시 연결해야하는 작업이 발생할 수 있습니다.
위와 같은 이유로 불변성은 효율적으로 데이터를 저장하기 위해 생겼습니다.
#참조형데이터
참조형 타입의 종류는 객체, 배열, 함수, 날짜, 정규표현식, Map, WeakMap, Set, WeakSet이 있다.
일반적으로 참조형은 '값이 지정된 주소의 값을 할당한다.'
#참조형 데이터의 저장방식
참조형은 객체의 변수(프로퍼티) 영역이 별도로 존재하는 차이점이 있습니다. 데이터 영역에 저장된 값은 모두 불변 값입니다. 데이터 영역에는 객체 변수 영역의 위치 값만 저장되어있고, 객체 변수 영역에는 다른 값이 들어갈 수 있기 때문에 참조형 데이터는 가변적이라고 합니다. 아래로 예시를 들어보겟습니다.
- 변수 영역의 빈 공간 @1002를 확보, 주소 이름을 obj1이라 저장합니다.
- 임의의 데이터 저장 공간 (@5001)에 데이터를 저장하려고 보니, 여러 개의 프로퍼티로 이뤄진 데이터 그룹이다. 이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소 @7103~을 @5001에 저장합니다.
- @7103, @7104에 각각 a, b 프로퍼티 이름을 지정합니다.
- 데이터 영역에서 숫자 1 검색한다. 검색 결과가 없으면 임의로 @5003에 저장하고, 이 주소를 @6103에 저장합니다. 'bbb' 문자열이 없으면 @5004에 저장하고, 이 주소를 @7104에 저장합니다.
#가변성
변수 영역에 저장된 값이 변하는 것입니다.
예를들어서 이래와 같습니다.
let a = {
k : 1,
};
let b = a;
a.k = 2;
여기서 중괄호가 싸고 있는 즉 a에 할당된 것을 객체라고 합니다.
{ k : 1 } 객체는 메모리에 할당이 되고 a는 그곳을 바라보게 되고, b도같이 바라보게 됩니다.
그 뒤에 a.k=2 를 실행하게 되면 해당 메모리내에서 변경이 된다. 그렇기 때문에 b도 같이 변하게되죠.
'모르는용어 정리' 카테고리의 다른 글
얕은 복사와 깊은 복사 (1) | 2023.01.20 |
---|---|
undefined와 null (0) | 2023.01.20 |
정적 타입과 동적타입 (0) | 2023.01.20 |
var let const 호이스팅 (0) | 2023.01.20 |
전역변수 (0) | 2023.01.20 |