My Wiki (CodesStates)/JS,Node

(3-1) JS/Node 스코프,클로저 - 원시자료형과 참조자료형

Esoolgnah 2021. 8. 4. 14:51
728x90

 

원시 자료형이란?  객체가 아니면서 method 를 가지지 않는 6가지의 타입.

string, number, bigint, undefined, symbol, (null) 이 있다. 원시자료형은 모두 "하나" 의 정보, 즉 데이터를 담고 있다. 데이터 보관함 한 칸에 하나의 데이터만 넣을 수 있는 예전의 "원시적인" 방식인 것이다.

'string', 42, true, false, undefined // 데이터가 "하나"의 정보를 담고 있다

 

 

변수에는 하나의 데이터만 담는다.

변수에는 데이터의 크기와는 관계 없이 하나의 데이터만 담을 수 있다. 또한 원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만 변수에 다른 데이터를 할당할 수는 있다.

"hello world!"
"hello codestates!"
// "hello world!" 와 "hello codestates!"는 모두 변경할 수 없는 고정된 값이다.

let word = "hello world!" 
word = "hello codestates!" 
// 하지만 word라는 변수에 재할당을 하여 변수에 담긴 내용을 변경은 가능하다.

const num1 = 123;
num1 = 123456789; // 에러 발생
// const 키워드로 선언하면 재할당은 불가하다.

 

 

배열과 객체를 담았을 때는 여러 데이터가 왔다갔다 하지 않나?  하나만 못 담는데..

참조 자료형을 변수에 할당할 때는 변수에 값이 아닌 주소를 저장한다. 그리고 이 주소 자체와 주소가 할당되는 과정을 우리가 눈으로 확인할 수 없기 때문에 이해하기 어렵다. 하지만 꼭 이해하고 넘어가자. 

  • bigintsymbol은 특별한 경우 사용하는 데이터 타입으로, 자세히 다루지는 않는다. MDN을 참고하여 공부해보자.
  • null은 원시 타입과 거의 같게 사용된다고 볼 수 있다. 작동 방식 또한 다른 원시 타입과 같습니다. 다만 엄밀하게 따지자면 원시 타입이라고 볼 수 없다. MDN과 이 스텍오버플로우 답변을 참고해보자.

 

 

 

참조 자료형이란? 원시 자료형이 아닌 모든 것.  배열([ ]), 객체({ }), 함수(function(){})가 대표적이다.

참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기게 된다. 그래서 참조 자료형의 데이터 자체는 원시 자료형이 보관되는 데이터 보관함이 아닌 특별한 데이터 보관함에 저장된다. 이 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 변수에 저장된다. 즉 변수에는 특별한 데이터보관함을 찾아갈 수 있는 주소가 담겨있고 이 주소를 따라가보면 특별한 데이터 보관함을 찾을 수 있다.

이 특별한 데이터 보관함에서는 자기 마음대로 사이즈를 늘렸다가 줄였다가 한다. ("동적(dynamic)으로 변한다"라고 하기도 한다.) 이처럼 데이터는 별도로 관리되고 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference type이라고 불린다. 이런 특별한 데이터 보관함을 heap이라고도 부른다.

 

 

 

 

 

 

특별한 데이터 보관함은 왜 동적으로 크기가 변하게 되었을까?

대량의 데이터가 들어오는 경우는 고정된 데이터 공간을 사용하는 것이 비효율적이다. 그렇기 때문에 크기가 상황에 따라서 커졌다가 작아지는 특별한 데이터 저장소를 만들어 사용하기로 합의했다. 데이터가 언제 늘어나고 줄어들지 모르기 때문에 별도의 저장공간을 마련하여 따로 관리하는 것이다. 변수에는 원시값 혹은 주소만 지정할 수 있고, 주소는 크기가 변하는 특별한 데이터 저장소를 참조하게 되는 것이다.

 

 

 

 

반응형