원시 타입 데이터 참조 타입 데이터 (깊은복사 얕은복사)

김재현·2022년 11월 11일
1

유닛 진행!

목록 보기
6/18

무엇일까?

let a; 변수를 선언 했을때 컴퓨터의 메모리에서는 어떤 일이 일어나게 될까?
stack이라는 여러 사물함중 하나에 a라는 이름이 붙여진다. 변수에 a = 1; 이렇게 할당 하면 사물함에서 a를 찾아 값인 1을 사물함 안에 넣게 된다.
값을 불러올때는 사물함에서 이름표를 찾아 값을 반환하게 된다.
let b = 2; let c = 3; 이런식으로 변수를 할당하면 a사물함,b사물함,c사물함이 생기게 되고 값을 찾기에도 수월해진다.
number,string,boolean,undefined,null은 이에 해당한다.
이것을 원시 타입 데이터라고 부른다!

값이 여러개인 배열은 어떻게 될까?

위 처럼 적용하게 되면 배열 하나는 편할 수 있어도 배열이 여러개라면 제거나 추가할때는 어떻게 해야할까 index를 찾을때 하나씩 비교하며 찾아야만 할까?
수가 늘 수록 시간도 오래 걸리게 될 것이다.
그래서 사물함의 아래부분을 없애고 heap이라는 빈 공간을 만들어 준다.
let a = [1,2,3]; 일때 사물함에 a라는 이름을 달고 안에는 heap의 주소를 넣어주고 heap에는 그 주소의 값을 연결시켜 놓는다.
즉 a 사물함 안에는 heap의 주소가 들어가 있고 heap에는 a의 값이 연결되어 있다. 그럼 a의 값을 찾을때는 어떻게 할까? 1. a사물함으로 간다. 2.a사물함 안에 있는 주소를 따라 간다. 3.주소를 따라간 heap에서 값을 찾는다.
이렇게 되면 원소를 제거하거나 추가할때 주소지에서 처리하게 되기 때문에 배열을 여러개 만들어도 사물함이 복잡해지지 않는다. 왜? 사물함이 아니라 heap에서 처리를 하기 때문이다. array,object,function이 세가지는 위 내용에 해당되고 참조타입 데이터라고 한다.

원시 타입 데이터는 각 변수간에 원시타입 데이터를 복사할경우에 복사 값을 다른 메모리에 할당하기 때문에 기존 데이터에 영향이 가지 않는다.

let a = 1;
b = a;
b = 2;
console.log(a) // 1

하지만 참조타입 데이터는 주소를 복사한다. 그렇기 때문에 복사한 데이터에서 원소를 변경하게 된다면 주소안에 데이터가 변경이 되기 때문에 데이터가 변경되는 것이다! (=== 얕은복사)

let a = [1,2];
let b = a;
b[0] = 50;
a = [50,2]

깊은 복사를 하려면 3가지 방법이 있다고 한다.
재귀함수를 이용하거나 JSON.stringify() 를 이용하거나 lodash 라이브러리를 사용하거나 이다.
깊은 복사를 해야겠다 마음 먹었을때 다시 한번 생각해 보자.
정말 나에게 필요한 것인지..

profile
티스토리로 이사갔습니다. => https://lobsterhyeon.tistory.com/

0개의 댓글