얕은복사 깊은복사

이진경·2023년 5월 26일
0

🐤 JAVASCRIPT

목록 보기
5/9

✅ 데이터 타입

데이터의 타입에는 크게 두가지가 있다.

  • 기본형 : number, string, boolean, null, undefined, symbol 등
  • 참조형 : object, array, function, date, regexp 등

일반적으로 기본형은 할당이나 연산시 복제되고, 참조형은 참조된다고 알려져있다. 그치만 엄밀히 말하면 둘 다 복제를 한다.

  • 기본형은 값이 담긴 주솟값을 바로 복제하고
  • 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다.

👉 식별자와 변수

  • 변수 : 변할 수 있는 무언가 = 데이터
  • 식별자 : 어떤 데이터를 식별하는데 사용하는 이름, 즉 변수명!

✅ 변수의 선언과 데이터 할당

변수는 변경 가능한 데이터가 담길 수 있는 공간이라고 이해하는게 정확하다.

let a ;

위와같은 명령을 받은 컴퓨터는 메모리에서 비어있는 공간 하나를 확보한다. 그리고 그 공간의 이름을 a라고 지정한다.

let a;
a = 'abc';

이제 a에 데이터를 할당하면 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보해 'abc'를 저장하고, 그 주소를 변수 영역에 저장하는 식으로 동작합니다.

데이터의 성질에 따라 변수영역 / 데이터 영역으로 구분한다.

let a = 'abc';
a = 'abcdef'

위 처럼 a에 다른 값을 재할당했을때는 기존 데이터 영역에 저장된 'abc'의 값이 변경되는게 아니라 다른 메모리 공간에 'abcdef'를 저장하고 그 주솟값을 참조한다.


✅ 불변값과 가변값

1️⃣ 불변값

불변성 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역 메모리이다.
기본형 데이터인 number, string, boolean, null, undefined, symbol은 모두 불변값이다.

let a = 5;
let b = 5;

a = 7;
  • 변수 a에 5를 할당하면 컴퓨터는 데이터 영역에서 5를 찾고 없다면 데이터 공간을 하나 만들어 5를 저장한다.
  • 변수 b에 또 5를 할당하면 컴퓨터는 데이터 영역에서 5를 찾고 위에 만들어 놓은 5의 데이터영역의 주소를 재활용한다.
  • a의 값을 7로 변경할때 기존에 저장된 5를 7로 바꾸는게 아니라 데이터 영역에서 7을 찾고 없다면 새로 만들어 b에 저장한다. -> 결국 5와 7 모두 다른 값으로 변경이 불가하다❗️

💡 불변값의 성질은 한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다는 것이다.

2️⃣ 가변값과 참조형 데이터의 할당

참조형 데이터와 기본형 데이터와의 차이는 객체 변수 영역이 별도로 존재한다는 점이다.

  • 데이터 영역에 저장된 값은 모두 불변값이다.
  • 하지만 변수에는 다른 값을 얼마든지 대입할 수 있다. -> 이때문에 흔히 참조형 데이터는 가변값이라고 한다.

✅ 변수 복사

1️⃣ 기본형 데이터 복사

let a = 10;
let b = a;
b=20

console.log(a===b) // false
console.log(b)     // 20

기본형에서 데이터를 복사하고 변경하면 a와 b는 서로 다른 주소를 바라보게 되어 일치하지 않는다고 나온다.

2️⃣ 참조형 데이터 복사

let obj ={
   c : 15
}

let obj2 = obj

obj2.c = 20  

console.log(obj === obj2) // true
console.log(obj.c)        // 20

참조형 데이터를 복사하고 obj2.c의 값을 변경하면 obj.c의 값도 변경된다.
이 코드에서 obj와 obj2는 같은 객체를 가리키고 있다.
let obj2 = obj 라인에서, obj의 참조값이 obj2에 복사된다. 그러므로 obj와 obj2는 같은 객체를 가리키게 된다. 즉, obj와 obj2는 메모리 상에서 동일한 위치를 참조하고 있다.

따라서 obj2.c = 20을 통해 obj2의 c 속성을 변경하면, obj도 동일한 객체를 가리키고 있기 때문에 obj.c의 값도 변경된다. obj와 obj2는 서로 다른 변수이지만, 객체 자체는 같기 때문에 한 변수를 통해 객체를 수정하면 다른 변수에서도 수정된 결과를 볼 수 있다.


✅ 얕은 복사와 깊은 복사

얕은 복사는 바로 아래 단계의 값만 복사하는 방법이고, 깊은 복사는 내부의 모든 값들을 찾아 전부 복사하는 방법이다.

중첩된 객체에서 참조형 데이터가 저장된 프로퍼티를 복사할 때 그 주솟값만 복사한다는 의미이다.
사본을 바꾸면 원본도 바뀌고, 원본을 바꾸면 사본도 바뀌게 된다.

1️⃣ 깊은 복사 (Deep copy)

  • 데이터 자체를 통째로 복사한다.
  • 복사된 두 객체는 완전히 독립적인 메모리를 차지한다.

2️⃣ 얕은 복사 (Shallow copy)

  • 아주 최소한만 복사를 한다.
  • 값을 복사할때 인스턴스가 메모리에 새로 생성되지 않는다.
  • 값 자체를 복사하는 것이 아니라 주소값을 복사하여 같은 메모리를 가리킨다.

👉 참조형 데이터를 불변값으로 사용하고 싶다면 내부 프로퍼티들을 일일이 복사하면 된다!(=깊은복사)

profile
멋찐 프론트엔드 개발자가 되자!

0개의 댓글