원시 자료형과 참조 자료형 [R]

nada_1221·2022년 7월 11일
0

공부

목록 보기
7/49
post-thumbnail

Primitive data
: number, string, boolean 과 같은 고정된 저장공간을 차지하는 데이터 (undefined,null 등도 포함)

let a = 1;
b=a;
b=2;
a;

라고 하더라도 a=1, b=2 식으로 a라는 데이터 값을 복사해서 사용하는 것이므로 b 를 수정하더라도 a의 값에 변형이 가지 않는다.

Reference data

let e = [1,2];
let f = e;
f[0] = 5;
e;
/// f : [5,2] === e : [5,2] 

라고 하면 e = [10,20] 이라는 데이터의 주소를 가져와서 사용하는 것이므로 f의 값을 변형하면 e의 값도 변형된다.


JavaScript 에서 원시 타입의 데이터 (primitive data types)는 객체가 아니면서 method를 가지지 않는 6가지의 타입

string,number,bigint,boolean,undefined,symbol,null

을 말한다.
이 중에서 자주 사용하는 4(+1)가지 원시 자료형

string,number,boolean,undefined,null

을 살펴보자.

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

원시 자료형은 모두 "하나"의 정보, 즉, 데이터를 담고있다.
옛날에 어떻게 코드를 작성했는지 돌아보면, 왜 이런 단순한 데이터가 "원시적인" 데이터라고 조금 더 쉽게 이해할 수 있다.
그때는 데이터 저장소(=메모리)의 용량이 제한되어 변수 하나에 데이터 용량이 제한된 하나의 원시 자료형 밖에 담을 수 없었기 때문이다.
원시자료형은 데이터 보관함 한 칸에 하나의 데이터만 넣을 수 있는 그때의 "원시적인" 방식

참조 자료형은?

const color = ['red','blue','green'];//사용될 수 있는 색의 종류를 담고 있습니다.
const champ = [
  name : shaco,
  class : assassin,
  str : 63,
  def : 26,
  // ...
  // 특정 게임의 챔피언의 정보를 담고 있습니다.
]

참조 자료형은 딱 봐도 하나의 주제는 있지만 서로 다르고, 여러 개의 데이터를 가지고 있는 것을 확인할 수 있다.

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

const num1 = 123;
const num2 = 4567890;

이렇게 변수에는 데이터의 크기와는 관계없이 하나의 데이터만 담을 수 있다.

원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.

"hello world"
"hello velog!"
//"hello world", "hello velog!" 모두 변경할 수 없는 고정된 값.
let word = "hello world"
word = "hello velog!"
//하지만, word라는 변수에 재할당을 하여 변수에 담긴 내용을 변경하는 것은 가능합니다.

const word1 = "hello world"
word1 = "hello velog!" // 에러 발생
// const 키워드로 선언하면, 재할당은 불가능합니다.

그런데 변수에는 하나의 데이터만 담는다. 라는 표현은 지금까지 배운 내용과 다른 점이 있다.

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

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


JavaScript에서 원시 자료형이 아닌 모든 것은 참조 자료형이다. 배열([])과 객체({}), 함수(function(){})가 대표적. 이런 자료형을 JavaScript에서는 참조 자료형(reference data type; 참조 타입)이라고도 부른다.

컴퓨터가 처음 사용되던 시절에는 배열, 즉 리스트라는 개념을 구현하기가 어려웠다. 그래서 띄어쓰기, 탭, 쉼표 등으로 데이터를 구분하여 배열과 비슷한 형태로 자료 구조를 구현하기 시작했다. 이 흔적은 csv에서도 찾아볼 수 있다. 쉼표로 구분된 데이터(Comma-Separated Values)라는 의미.

1,2,3,4,5,6

이렇게 하나의 스트링을 split 하던 형식으로 사용되던 배열이 매우 자주 사용됨으로써 이제 대부분의 컴퓨터 언어에는 JavaScript처럼 배열(혹은 비슷한)이라는 자료 구조가 구현이 되어 있다. 요소의 추가, 삭제, 변경 정도만 알면 쉽게 배열을 다룰 수 있게 되었다. 왜 따로 자료 구조를 구현해야만 했을까? 변수에 넣을 수 있는 데이터 크기가 제한되기 때문이다.

참조 자료형이 저장되는 데이터 보관함

참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기게 된다.
그래서 참조 자료형의 데이터 자체는 지금까지 배웠던 원시 자료형이 보관되는 데이터 보관함이 아닌 특별한 데이터 보관함에 저장된다.
이 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 변수에 저장된다.

즉, 변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있고, 이 주소를 따라가 보면 특별한 데이터 보관함을 찾을 수 있는데, 이 특별한 데이터 보관함에서는 자기 마음대로 사이즈를 늘렸다가 줄였다가한다. ("동적(dynamic)으로 변한다"라고 하기도 한다.)

이처럼 데이터는 별도로 관리되고, 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference data type이라고 불린다. 이러한 데이터 보관함을 heap이라고도 부른다.

왜 동적으로 크기가 변하게 되었을까?
배열과 객체는 대량의 데이터를 쉽게 다루기 위해서 사용된다고 했다. 쉽게 사용할 수 있는 이유는 크기가 고정되어 있지 않고 우리가 데이터를 추가하고 삭제하는 것에 따라서 크기가 달라지기 때문이다.

그렇다면, 100만 개의 데이터가 들어올 수 있는 상황에서 고정된 데이터 공간을 사용하는 것이 합당할까? 아니다. 대량의 데이터가 들어오는 경우는 동영상에서 설명한 바와 같이, 고정된 데이터 공간을 사용하는 것이 비효율적이다.

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

원시 자료형과 참조 자료형의 특징

  • 원시 자료형이 할당될 때에는 변수에 값(value) 자체가 담기고, 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담긴다.
  • 그래서 참조 자료형은 기존에 고정된 크기의 보관함이 아니라, 동적으로 크기가 변하는 특별한 보관함을 사용할 수 있다.
profile
FE_개발자_지망생

0개의 댓글