우리가 아는 복사라는 단어의 뜻은 원본을 copy한다.
예를 들어 종이를 복사하게 되면 원본 종이가 그대로 존재하고, 복사본 종이가 생기는 것이다. 바탕화면에 '안녕'이라는 폴더를 복사하면 '안녕_복사본' 폴더가 생기는 것이다. 이해를 돕기 위해 간단한 예를 들어 들어 보았다.
깊은 복사
란 우리가 알고 있는 복사의 개념이고, 얕은 복사
란 덮어쓰기 되었다 라고 생각하면 이해하기 수월 할 것 같다.
얕은 복사는 바로 아래 단계의 값만 복사는 방법
깊은 복사는 내부의 모든 값들을 하나하나 찾아서 전부 복사하는 방법
자바스크립트에서 참조형 데이터
는 값이 저장된 주소값을 할당하기 때문에 참조형 데이터
를 잘 다루기 위해서 얕은 복사와 깊은 복사에 대한 이해가 필요하다. 더 나아가 메모리적 관점을 알고 있으면 좋다.
참조형 데이터에 대해 자세히 알고 싶다면 👉 기본형과 참조형 종류와 차이점
자바스크립트 자료형에 따라 복사가 어떻게 일어나는지에 대해 간단하게 살펴보자.
기본 자료형의 값 복사를 다룰 때 얕은 복사, 깊은 복사라는 개념에 대해 논할 필요는 없다고 생각하지만, 깊은 복사란 무엇이고 얕은 복사가 무엇인지에 대한 이해를 위해 "기본 자료형의 값 복사 (깊은 복사)" 라는 표현을 사용해보았다.
let a = 10; // 변수 a에 10을 할당 -> 변수 a가 메모리 공간 101번지를 확보하고, 변수 a와 매칭되어 있는 주소값인 101 저장 공간에 10이 저장 된다.
let b = a; // 변수 b에 a를 할당 -> 메모리 공간 102번지 확보, 변수 c와 매칭된 주소값 102번지에 a가 저장 된다.
console.log(a); // 10
console.log(b); // 10
기본 자료형 값을 복사 할 때 복사된 값을 다른 메모리 공간에 할당하기 때문에 원래의 값과 복사된 값이 서로에게 영향을 미치지 않는다.
우리가 잘 알고 있는 복사의 개념 깊은 복사
가 된 것이다.
let b = '안녕'; // 변수 b에 '안녕'을 할당 -> 메모리 공간 201번지 확보, 변수 b와 매칭된 주소값 201번지에 '안녕'이 저장된다.
b = 1; // b에 1을 할당(재할당) -> 메모리 공간 201번지에 덮어 쓰게 된다.
console.log(b); // 1
값을 복사하는 것
과 값을 재할당 하는 것
에 대한 메모리적 관점에 대해 확실히 알고 넘어가면 좋을 것 같아 이러한 예제를 추가해보았다.
const car = {
name: 'genesis',
price: 1000,
};
let carCopy = car;
carCopy.price = 2000;
console.log(car); // { name: 'genesis', price: 2000 }
console.log(carCopy); // { name: 'genesis', price: 2000 }
1️⃣ 변수 car에 객체값을 할당하였다.
2️⃣ 변수 carCopy에 car를 할당 하였다.
이것이 바로 참조가 이루어 진 것이다.
객체는 어딘가에 따로 저장되어 있고 그 객체가 저장된 주소값만 복사해 온 것이다. 즉, 값이 저장된 주소값을 할당 해준다는 것을 알 수 있다❗
3️⃣ carCopy의 price 프로퍼티에 2000을 할당하였다.
carCopy 에 매칭된 302 주소로 이동하고 다시 1010 으로 이동한 다음 1010 안에서 price 프로퍼티를 찾고 price 와 매칭되어 있는 1012 주소로 이동하여 1000 대신에 2000 을 넣게된다.
4️⃣ carCopy 객체가 car 객체와 다른 새로운 객체를 만든 것이 아니라 본래 car 가 바라보던 객체를 함께 바라보고 있기 때문에 car === carCopy
는 완벽히 동일한 객체를 참조한다고 말할 수 있고, 얕은 복사
가 일어 난 것이다.
📎 기본형 데이터는 값을 그대로 할당하기 때문에 복사할때 값을 완전히 복사한다.
📎 참조형 데이터를 복사할때는 값을 복사하는 것이 아니라 그 값의 주소값을 참조하므로 얕은 복사(참조 복사)가 된다.
⭐ 따라서 참조형 데이터를 복사해서 사용할 때 이 점을 잘 유의해야 한다.