데이터 타입에는 기본형 타입, 참조형 타입이 있으며
이 방식은 저장 방식, 접근 방식, 복사 방식에서 차이를 보인다.
이번에 알아볼 기본형 타입은 변경할 수 없는 불변성을 가지고 있으며
아래의 종류와 같은 타입이 포함 된다.
- string
- nunber
- boolean
- null
- undefined
- symbol
- Bigint
위 타입들의 데이터를 복사할때는 값 자체가 복사된다.
그럼 기본형 데이터가 메모리 할당될 때 어떤 일이 일어나는지 알아보자.
1. 여기 let a= 1; 이라고 선언하는 순간 변수 영역과 데이터 영역에 저장된다.
변수영역
변수명 | a | |
주소 | @201 |
데이터 영역
주소 | 201 | 202 |
데이터 | 1 |
이렇게
변수 영역에서는 식별자를 위한 공간으로,
데이터 영역에서는 실제 값을 저장하는 역할을 하여 서로가 하는 역할을 분리하여 저장한다.
그런데 왜 변수 영역에 바로 저장하지 않고 분리하여 저장할까??
바로 메모리의 효율과 값 복사의 단순화 때문이다.
2. 이번에는 let a=1; let b=1; 이렇게 두 변수에 같은 값을 선언해본다.
변수 영역
변수명 | a | b |
주소 | @201 | @201 |
데이터 영역
주소 | 201 | 202 |
데이터 | 1 |
이때 변수 b는 새로운 데이터를 할당할 필요 없이 기존 주소 201의 데이터 1을 참조하게 된다.
메모리에 같은 기본형 값이 있는지를 먼저 확인하고 존재한다면 해당 값의 주소를 참조하여 메모리를 효율적으로 관리하는 원리이다.
3. 이번에는 let a=1; 을 a=2; 로 값을 변경해본다.
변수 영역
변수명 | a | |
주소 | @202 |
데이터 영역 (Stack)
주소 | 201 | 202 |
데이터 | 1 | 2 |
이러한 경우 데이터 영역의 주소 201 데이터 값을 2로 변경하는 것이 아닌
새롭게 주소202에 데이터 값 2를 만들어 변수 a를 주소 202에 참조하도록 한다.
데이터 영역에 한 번 생성된 값은 변경될 수 없으며 값이 수정이 필요하다면 새로운 값이 메모리에 할당되는 것이다.
이러한 점으로 인해 자바스크립트의 기본형이 불변성을 가진다는 특성을 나타낸다.
그렇다면 기존 변수에서 사용되던 숫자 1은 어떻게 되는가?
복잡한 프로그램이라면 수많은 데이터가 있을텐데 전부 데이터 영역에 쌓여있게 된다면 메모리가 가득 차 효율적이지 못할 것이다. 다행히도 자바스크립트 엔진에서는 데이터를 참조하는 다른 변수나 요소가 없다면 가비지 컬렉터에 의해 메모리에서 삭제한다.
가비지 컬렉터
자바스크립트 엔진이 정기적으로 메모리를 스캔해서 참조되지 않는 객체를 찾아내고 이러한 객체를 메모리에서 해제하는 프로세스
정리하자면
기본형 데이터의 값은 변수 영역과 데이터 영역에 저장되며
변수 영역은 데이터 영역의 주소를 참조, 데이터 영역에 실제 값 저장하고
새로운 값이 추가 되면 데이터 영역의 기존 값이 변경되는 것이 아닌 새로 메모리에 할당하는 방식으로 작동한다.