• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

primitive type 질문드립니다!

21.04.22 01:19 작성 조회수 162

0

안녕하세요 선배님

다름이 아니라 기존에 제가 알았던 지식으로는 primitive type은 값 자체를 저장하는 것으로 알았는데

이번 강의를 통해 할당된 값을 가지고 있는 주소값을 저장하는 것을 처음 알게되었습니다.

그렇다면 primitive 변수에 기존에 할당된 값을 변경할 때 먼저 변경된 데이터 값을 가지고 있는 메모리가 있는지 찾고 만약 없다면 새로 데이터를 할당한 뒤 해당 주소값을 저장하게 되는데 이전에 할당된 데이터값을 저장하고 있는 메모리 공간은 프로그램이 종료될때까지 자리를 차지하고 있는건가요? 또한 데이터값을 저장하고 있는 메모리들은 전부 힙에 저장되어지나요?? 

답변 3

·

답변을 작성해보세요.

0

1. 네 맞습니다.

2. "변수는 원시데이터가 저장된 주솟값을 참조한다"가 맞습니다.

Downey님의 프로필

Downey

질문자

2021.04.22

답변 감사합니다~!!

강의 내용이 너무 알차서 바로 책까지 구매했네요

좋은 강의 감사합니다~

0

Downey님의 프로필

Downey

질문자

2021.04.22

친절한 답변 감사합니다!!

자세히 설명해주셔서 이해가 확실하게 됐어요!

다만 처음에 질문드렸던 다른 질문 중 하나가 기본형 타입이 메모리에 저장될 때 할당된 데이터를 저장하는 메모리 공간이  힙이 아닌 스택 메모리 공간인가요?

ex)

let a = 3;

1004                                                       5003

이름: a                                                       3

값: @5003

-------------------------------------------------------------------------------------

이부분에서의 5003의 메모리 공간은 고정된 크기의 데이터이기 때문에 스택 메모리 공간에 저장되는게 맞을까요?

스택 메모리 공간이 맞다면 GC를 통해 스택 메모리 공간의 데이터도 관리되는게 맞을까요?

------------------------------------------------------------------------------------

그리고 혼자 공부하다가 너무 혼란스러워서 ㅠㅠ 한가지만 더 질문 드리자면

"원시 타입 데이터는 변수에 할당될 때 메모리 상에 고정된 크기로 저장되고 해당 변수가 원시 데이터 값을 보관한다."

제가 흔히 primitive type의 정의를 봤을 때 위와 같은 내용이였는데 정확히 말하면 위 내용은 틀린 내용 아닌가요??

정확히는 " 해당 변수가 원시 데이터 값을 보관한다." -> "해당 변수가 원시 데이터를 저장하는 메모리 주소값을 보관한다" 이게 맞는말 맞나요??

0

이에 대해서는 참조카운트와 GC에 대해 공부해보시면 좋을것 같아요.
결론을 짧게 말씀드리자면, 어떤 변수도 참조하지 않는 데이터는 GC의 대상이 되어 어느순간 제거됩니다.

예를 들어서

1 | var a = 1;
2 | function b() {
3 |   var c = 1;
4 |   console.log(c);
5 | }
6 | b();
7 | 
8 | a = undefined;
9 | console.log(a);

(1) '1'이라는 데이터는 전역공간에서 선언한 변수 a에 의해 최초로 저장되어 참조카운트가 1입니다.
(6) b함수의 실행컨텍스트가 활성화되면
(3) c 변수도 데이터 '1'을 참조하게 되어 참조카운트가 2가 되었다가
(5) b함수가 종료되는 시점에 다시 참조카운트는 1로 됩니다.

(8) a에 다른 값을 할당하면 이제는 데이터 '1'에 대한 참조카운트가 0이 되므로
이제 GC의 수거 대상이 되어 어느순간 메모리에서 제거될 것입니다.

만약 (8)이 없다면, 데이터 '1'은 전체 코드가 종료될 때까지 메모리에 남아있음이 확실하나,

(8)이 있는 경우에는 코드 종료 시점에 데이터 '1'이 메모리에 남아있는지 아닌지를 장담할 수 없습니다. 
GC가 언제 발동될지는 알 수 없기 때문입니다.