JavaScript / / 2023. 6. 15. 01:44

[자바스크립트 스터디] 자바스크립트의 데이터 타입, 참조형

 

[자바스크립트 스터디] 자바스크립트의 데이터 타입, 원시형

최근에 코어 자바스크립트를 통해 아는 친구의 대학 후배들과 스터디를 진행하고 있다. 그에 대한 내용을 정리할 겸, 이제부터 하나하나 찬찬히 참조해보려고 한다. 1. 자바스크립트의 데이터

kimkani.tistory.com

 

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"를 할당한다면 다음과 같은 경우가 일어난다.

  1. 변수 영역에서 빈 공간 (@1002)을 확보한다.
  2. 확보한 공간의 식별자를 hobbies로 정한다.
  3. 이때, 이 hobbies의 경우 여러개의 프로퍼티로 이루어져 있기 때문에 별도의 데이터 영역에서 주소를 @7003 ~ @? 으로 지정한다.
  4. @7003 및 @7004에 age와 name이라는 프로퍼티 이름을 지정한다.
  5. 데이터 영역에서 숫자 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의 수거 대상이 되며, 런타임 호나경에 따라 특정 시점에 수거 - 즉 메모리에서 비할당 - 한다. 

 

다음 글에서는 참조형의 복사에 대해서 알아보겠다.

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유