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 |
주소 | 7103 | 7104 | 7105 | 7106 |
---|---|---|---|---|
데이터 | a/5003 | b/5002 |
위 예시와 같이 데이터 영역에 저장된 값은 여전히 불변!
obj1을 위한 별도 영역은 변경이 가능!
→ 따라서 참조형 데이터를 불변하지 않다 라고 합니다. ( 가변 )
c. 중첩객체의 할당
var obj = {
x: 3,
arr: [3, 4, 5],
}
// obj.arr[1]의 탐색과정은 어떻게 될까요? 작성하신 표에서 한번 찾아가보세요!
주소 | 1001 | 1002 | 1003 | 1004 | 1005 | … |
---|---|---|---|---|---|---|
데이터 | obj1 | |||||
주소 | 5001 | 5002 | 5003 | 5004 | 5005 | … |
데이터 | 3 | 4 | 5 |
주소 | 7103 | 7104 | … |
---|---|---|---|
데이터 | x | arr |
주소 | 8104 | 8105 | 8106 | … |
---|---|---|---|---|
0/5001 | 1/5002 | 2/5003 |
d. 참조 카운트가 0인 메모리 주소의 처리
참조카운트란 무엇일까요?
<aside> 💡 객체를 참조하는 변수나 다른 객체의 수를 나타내는 값입니다. 참조 카운트가 0인 객체는 더 이상 사용되지 않으므로, 가비지 컬렉터에 의해 메모리에서 제거됩니다.
</aside>
가비지컬렉터(GC, Garbage Collector)
<aside> 💡 더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하는 역할을 합니다. 자바스크립트는 가비지 컬렉션을 수행함으로써 개발자가 명시적으로 메모리 관리를 하지 않아도 되도록 지원합니다. 자바스크립트 엔진에서 내부적으로 수행되며, 개발자는 가비지 컬렉션에 대한 직접적인 제어를 할 수 없습니다.
</aside>
변수 복사의 비교
우리가 지금까지 작성했던 방법과 상당히 유사합니다. 먼저 기본형 및 참조형 데이터의 선언과 할당을 해보고, 변수 복사까지 진행해봅시다! 강의를 참고하여 역시 표를 작성해주세요 😎
// STEP01. 쭉 선언을 먼저 해볼께요.
var a = 10; //기본형
var obj1 = { c: 10, d: 'ddd' }; //참조형
// STEP02. 복사를 수행해볼께요.
var b = a; //기본형
var obj2 = obj1; //참조형
| --- | --- | --- | --- | --- | --- | --- |
| --- | --- | --- | --- |
복사 이후 값 변경(객체의 프로퍼티 변경)