Javascript에서는 데이터의 타입은 크게 기본형과 참조형으로 나뉘어집니다.
기본형과 참조형의 구분은 값의 저장 방식과 불변성의 여부입니다.
비트
바이트
0과 1만 표현하는 비트를 모두 찾기는 부담
1개 → 2개 → … → 8개(새로운 단위 : byte)
(이미지 출처 : https://namu.wiki/w/바이트)
메모리(memo + ry) : byte 단위로 구성
<aside> 💡 만일, 64비트(8바이트) 정수는 메모리에 어떻게 저장할 수 있을까요? ⇒ 64비트를 8개의 바이트로 분할하고, 각 바이트를 메모리에 저장해야 해요. 각 바이트는 8개의 비트를 가므로 64비트 정수는 메모리에서 8개의 연속된 바이트에 저장된답니다.
</aside>
java, c와 다른 javascript의 메모리 관리 방식(feat. 정수형)
변수 선언과 데이터 할당
예시
/** 선언과 할당을 풀어 쓴 방식 */
var str;
str = 'test!';
/** 선언과 할당을 붙여 쓴 방식 */
var str = 'test!';
주소 | … | 1002 | 1003 | 1004 | 1005 | … |
---|---|---|---|---|---|---|
데이터 | str @5002 | |||||
주소 | … | 5002 | 5003 | 5004 | 5005 | … |
데이터 | test! |
변수 영역 : 2바이트 1만개 = ****2만바이트
<aside> ℹ️ 이해를 돕고자, 변수 영역에 저장되는 데이터는 2바이트로 가정했어요!
</aside>
데이터 영역 : 8바이트 1개 = 8바이트
총 : 2만 8바이트
기본형 데이터와 참조형 데이터
메모리를 기준으로 다시 한번 생각해보는 두 가지 주요 개념
불변 vs 불변X
가변값과 가변성 ( 참조형 데이터 )
참조형 데이터 변수 할당
// 참조형 데이터는 별도 저장공간(obj1을 위한 별도 공간)이 필요합니다!
var obj1 = {
a: 1,
b: 'bbb,
};
주소 | 1001 | 1002 | 1003 | 1004 |
---|---|---|---|---|
데이터 | obj1/7103~7104 | |||
주소 | 5001 | 5002 | 5003 | 5004 |
데이터 | 1 | bbb |
주소 | 7103 | 7104 | 7105 | 7106 |
---|---|---|---|---|
데이터 | a/5001 | b/5002 |
참조형 데이터가 불변하지 않은 이유 (가변한 이유)
var obj1 = {
a: 1,
b: 'bbb',
};
// 데이터를 변경해봅시다.
obj1.a = 2;
주소 | 1001 | 1002 | 1003 | 1004 |
---|---|---|---|---|
데이터 | obj1/7103~7104 | |||
주소 | 5001 | 5002 | 5003 | 5004 |
데이터 | 1 | bbb | 2 |
| --- | --- | --- | --- | --- |
위 예시와 같이 데이터 영역에 저장된 값은 여전히 불변!
obj1을 위한 별도 영역은 변경이 가능!
c. 중첩객체의 할당
d. 참조 카운트가 0인 메모리 주소의 처리
변수 복사의 비교
복사 이후 값 변경(객체의 프로퍼티 변경)