1. 스택과 힙 메모리
만약 당신이 변수를 선언하면, 자바스크립트 엔진은 이 변수들을 위해 두개의 메모리 지역 - 힙과 스택 - 에 변수들을 할당한다. 앞 글에서 설명했듯이 스택에는 미리 사이즈를 알 수 있는 데이터만이 들어가며, 그 외에 런타임시 변경될 수 있는 데이터는 힙에 들어간다. 이러한 데이터는 바로 Object(객체) 혹은 function(함수)이다.
위의 경우를 예시로 hobbies랑 person이 어떻게 되는지 한번 알아보겠다.
변수영역
주소 | 1002 | 1003 | 1004 | ... |
데이터 | 이름 : hobbies 값 : @5002 |
데이터 영역
주소 | 5002 | 5003 | 5004 | ... |
데이터 | @7003~@? | 28 | "MAX" |
객체 영역(heap)
주소 | 7003 | 7004 | 7005 | ... |
데이터 | 이름: age 값: @5003 |
이름: name 값: @5004 |
만약 우리가 var age = 28과 var name = "MAX"를 할당한다면 다음과 같은 경우가 일어난다.
- 변수 영역에서 빈 공간 (@1002)을 확보한다.
- 확보한 공간의 식별자를 hobbies로 정한다.
- 이때, 이 hobbies의 경우 여러개의 프로퍼티로 이루어져 있기 때문에 별도의 데이터 영역에서 주소를 @7003 ~ @? 으로 지정한다.
- @7003 및 @7004에 age와 name이라는 프로퍼티 이름을 지정한다.
- 데이터 영역에서 숫자 28과 이름 "MAX"를 검색하고 없으므로 임의로 @5003과 @5004에 저장한다.
여기서 데이터 영역은 불변값이다. 다만 변수에는 얼마든지 다른 값을 넣을 수 있다. 이 부분에서 흔히 참조형 데이터는 가변이라고 한다.
만약 여기서 중첩으로 객체를 만든다면 어떻게 될까?
var hobbies = {
age: 28,
hobby: ["baseball", "soccer", "home"]
}
변수영역
주소 | 1002 | 1003 | 1004 | ... |
데이터 | 이름 : hobbies 값 : @5002 |
데이터 영역
주소 | 5002 | 5003 | 5004 | 5005 | 5006 | 5007 | ... | |
데이터 | @7003~@? | 28 | baseball | @8003~@? | soccer | home |
객체 영역(heap)
주소 | 7003 | 7004 | 7005 | ... |
데이터 | 이름: age 값: @5003 |
이름: hobby 값: @5005 |
객체 영역(heap)
주소 | 8003 | 8004 | 8005 | ... |
데이터 | 이름: 0 값: @5004 |
이름: 1 값: @5006 |
이름: 2 값: @5007 |
1. 컴퓨터에서 우선 변수 영역의 빈 공간을 탐색한다. 그리고 위의 예시에서는 @1002에 들어간다.
2. 이때 hobbies의 경우는 여러개의 변수와 값들을 모아놓은 객체이다. 따라서 hobby와 age를 저장하기 위한 별도의 변수 영역을 마련한다. 그 공간은 @7003 ~ @?이 된다. 그 이후에 그 영역의 주소를 @5002에 저장한다.
3. @7003에는 age를 @7004에는 hobby를 선언한다.
4. 데이터 영역에서 숫자 28을 검색하고 없으므로 임의의 주소인 @5003에 저장한다. 이는 다시 @7003에 저장된다.
5. 이때 hobby의 경우 여러개의 변수와 값들을 모아놓은 객체이다. 이때 이 객체는 배열이므로 이 배열 들의 원소를 저장할 별도의 변수 영역을 마련한다. 이 때 이 변수 영역은 @8003 ~ @?가 되고 이를 @5005에 저장한다.
6. 그 후 각 값을 찾고서 없으면 새로운 영역에 저장한 다음 각각의 @8003~에 할당한다.
만약 여기서 hobbies.hobby = 28로 할당하면 어찌 될까?
변수영역
주소 | 1002 | 1003 | 1004 | ... |
데이터 | 이름 : hobbies 값 : @5002 |
데이터 영역
주소 | 5002 | 5003 | 5004 | 5005 | 5006 | 5007 | ... | |
데이터 | @7003~@? | 28 | baseball | @8003~@? | soccer | home |
객체 영역(heap)
주소 | 7003 | 7004 | 7005 | ... |
데이터 | 이름: age 값: @5003 |
이름: hobby 값: @5003 |
객체 영역(heap)
주소 | 8003 | 8004 | 8005 | ... |
데이터 | 이름: 0 값: @5004 |
이름: 1 값: @5006 |
이름: 2 값: @5007 |
지금 @7004에 @5003의 값이 할당되어 있다. 이전까지는 참조하던 값들이 있었지만, 그 이후에는 참조하던 값들이 사라진다. 자신의 주소를 참조하는 변수의 개수를 참조 카운트라고 한다. 그리고 이러한 참조 카운트가 없어진 것이 위의 표에서 볼드체 된 곳들이다. 참조 카운트가 0인 메모리 주소는 Garbage Collector, GC의 수거 대상이 되며, 런타임 호나경에 따라 특정 시점에 수거 - 즉 메모리에서 비할당 - 한다.
다음 글에서는 참조형의 복사에 대해서 알아보겠다.
'JavaScript' 카테고리의 다른 글
[자바스크립트 스터디] 클로저(Closure) 그리고 작동 원리 (1) | 2024.01.11 |
---|---|
[자바스크립트 스터디] Scope(스코프), Scope Chain(스코프 체인) (3) | 2023.12.30 |
[자바스크립트 스터디] 자바스크립트에서의 호이스팅(Hoisting) (0) | 2023.12.28 |
[자바스크립트 스터디] 자바스크립트의 실행 환경(Execution Context), Lexical Environment (1) | 2023.12.22 |
[자바스크립트 스터디] 자바스크립트의 데이터 타입, 원시형 (0) | 2023.04.30 |