JavaScript Data type
1.primitive type
-> 기본형(원시형) -> 숫자(number), 문자열(string), 불리언(boolean), null, undefined, symbol(+ES6)
2. reference type
-> 참조형 -> 객체(object), 배열(Array), 함수(Function), 날짜(Date), 정규표현식(RegExp), [Map, WeakMap, Set, WeakSet] (+ES6)
기본형과 참조형의 구분 기준
기본형 : 값이 담긴 주솟값을 바로 복제
참조형 : 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값(object)을 복제 -> 참조라는 말에 걸맞게
기본형의 특징
기본형은 불변성을 띈다
a의 값이 10 -> 15로 바뀌었는데, 불변성을 띈다?
불변성에 대해 말하기전 필요한 사전지식
JavaScript는 데이터를 할당할 때 변수 영역, 데이터 영역을 따로 나누어 할당한다.
1. 변수 영역에서 빈 공간 확보
2. 확보한 공간의 식별자를 a로 설정
3. 데이터 영역에서 빈공간 확보
4. 확보한 공간에 정수형 데이터 10 저장
5. 변수 영역의 식별자 a라는 공간에 정수형 데이터 10이 저장된 주소값 저장
ex) console.log(a);를 한 경우
변수 영역에서 식별자 a를 찾음 -> a라는 공간에 저장되어있는 데이터 영역을 가리키는 주솟값 얻음 -> 얻은 주솟값을 통해 데이터 영역에서 주소값에 맞는 데이터를 얻음 -> console창에 출력
왜 JavaScript는 변수 / 데이터 영역을 나눠서 할당하는가..?
1. 번거로움 해소
'확보된 공간을 변환된 데이터 크기에 맞게 늘리는 작업' -> 메모리상의 중간에 위치한 값의 형변환시, 그 다음 위치한 모든 값들을 형변환을 위한 확보시킬 공간만큼 뒤로 밀어주어야 한다.
2. 중복 데이터 처리
500개의 변수안에 숫자 5를 할당하는 경우
숫자형 데이터 할당 바이트 -> 8byte
1. 변수 / 데이터 영역 나누지 않은 경우
메모리 비용 : 500*8 = 4000
2. 변수 / 데이터 영역 나누어준 경우
주소의 공간 2바이트 가정
메모리 비용 : 500*2+8 = 1008
왜 1008이 나오는가?
5를 별도의 데이터 공간에 저장해 두고 각 변수가 5의 주솟값을 가지면 된다.
사전 지식을 확립했으니, 불변성에 대해서 이야기 해보자.
변수 영역
변수 vs 상수 -> 변경 가능성
즉, 데이터를 한번만 할당할것인지, 아니면 재할당 할것인지의 문제
데이터 영역
변경 가능성은 변수영역에서 생각
데이터는 한번 저장되면 다시는 변하지 않는다.
결론 : 데이터는 한번 저장되면 다시는 변하지 않기 때문에, 불변성을 띈다고 말 할 수 있다.
예시 1
변수영역 공간확보 a라는 이름을 제공 -> 데이터영역 공간 확보 후 'abc' 문자열 데이터 저장 -> 변수영역에서 a라는 이름을 가진 공간에 데이터영역에서 'abc' 문자열 데이터를 가진 공간의 주솟값을 제공 -> 데이터영역 공간 확보 후 'abcdef'문자열 데이터 저장 -> 변수영역에서 a라는 이름을 가진 공간에 데이터영역에서 'abcdef'문자열 데이터를 가진 공간의 주솟값을 제공
예시 2
간략화
b를 나타내는 변수공간 생성 -> 데이터 공간 생성후 5 저장 -> b 변수공간에 5를 가르키는 주솟값 저장 -> c를 나타내는 변수공간 생성 -> 데이터 공간에 5를 저장하기 전에, 5라는 데이터가 저장이 되었는지 확인 -> 저장이 되어있기 때문에 새로운 공간은 할당하지 않고, c변수공간에 5의 주솟값 저장 -> 7은 없는 데이터 값이므로 새로운 데이터 저장공간 생성 -> b 변수공간에 주솟값 재할당
참조형의 특징
참조형은 기본적인 성질은 가변값 이지만, 설정에 따라 불가능한 경우도 있고, 아에 불변값으로 활용하는 방안도 있다.
참조형 데이터를 변수에 할당하는 과정
변수 영역의 빈 공간(@1002)을 확보하고, 그 주소의 이름을 obj1로 지정한다 -> 임의의 데이터 저장 공간(@5001)에 데이터를 저장하려고 보니 여러 개의 프로퍼티로 이루어진 데이터 그룹이다. 이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소(@7310 ~?)를 @5001에 저장한다 -> @7103 및 @7104에 각각 a와 b라는 프로퍼티 이름을 지정한다 -> 데이터 영역에서 숫자 1을 검색한다 -> 검색 결과가 없으므로 임의로 @5003에 저장하고, 이 주소를 @7103에 저장한다. 문자열 'bbb' 역시 임의로 @5004에 저장하고, 이 주소를 @7104에 저장한다.
왜 불변값인가?
객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다. 데이터 영역에 저장된 값은 모두 불변값이다. 그러나 변수에는 다른 값을 얼마든지 대입이 가능하다. 바로 이부분 때문에 흔히 참조형 데이터는 불변하지 않다(가변값이다)라고 한다.
'2022년' 카테고리의 다른 글
엘리멘트 렌더링 (0) | 2021.12.08 |
---|---|
1.2 변수 복사 비교 ~ (0) | 2021.12.07 |
프래그먼트 트랜잭션 (0) | 2021.12.04 |
프래그먼트 관리자 (0) | 2021.12.04 |
Dialog (0) | 2021.10.22 |