'얕은 복사(shallow copy)'와 '깊은 복사(deep copy)'는 객체나 배열과 같은 참조 자료형을 복사할 때 원본 데이터와의 연결 방식에 따른 차이를 나타내는 개념이다.
1. 얕은 복사 (Shallow Copy)
- 정의: 원본 객체의 최상위 레벨 속성만 복사하고, 중첩된 객체나 배열은 원본 객체의 주소(참조)를 복사한다.
- 동작 방식:
- 원시 자료형(숫자, 문자열 등)은 값을 복사한다.
- 참조 자료형(객체, 배열 등)은 메모리 주소를 복사한다.
- 특징:
- 복사된 객체와 원본 객체가 일부 속성을 공유한다.
- 원본 객체의 중첩된 속성을 변경하면 복사된 객체에도 영향을 준다.
- 복사 속도가 빠르다.
- 사용 예시: JavaScript에서 Object.assign() 또는 ...(스프레드 연산자 , 전개 연산자, spread operator)를 사용하여 객체의 최상위 레벨 속성만 복사할 때 얕은 복사가 수행된다.
const originalObject = { a: 1, b: { c: 2 }, }; // 얕은 복사: Object.assign() 사용 const shallowCopyObject = Object.assign({}, originalObject); // 얕은 복사: 스프레드 연산자(...) 사용 // const shallowCopyObject = { ...originalObject }; shallowCopyObject.a = 3; shallowCopyObject.b.c = 4; console.log(originalObject); // { a: 1, b: { c: 4 } } console.log(shallowCopyObject); // { a: 3, b: { c: 4 } }
- 'originalObject'의 'b' 속성은 객체이다. 'shallowCopyObject'는 'originalObject'를 얕은 복사했기 때문에 'b' 속성은 같은 객체를 참조한다.
- 따라서 'shallowCopyObject.b.c'를 변경하면 'originalObject.b.c'도 함께 변경된다.
참조형 데이터는 원본 값을 수정함
얕은 복사는 참조형은 주소를 복사하기 때문에 내용을 바꾸면 해당 주소가 참조하는 데이터 자체를 수정한다.
2. 깊은 복사 (Deep Copy)
- 정의: 원본 객체의 모든 속성을 재귀적으로 복사하여 완전히 새로운 객체를 생성한다.
- 동작 방식:
- 원시 자료형은 값을 복사한다.
- 참조 자료형은 내부의 모든 속성 및 요소를 재귀적으로 복사한다.
- 특징:
- 복사된 객체와 원본 객체가 완전히 독립적이다.
- 원본 객체의 속성을 변경해도 복사된 객체에 영향을 주지 않는다.
- 복사 속도가 얕은 복사보다 느리다.
- 사용 예시: JavaScript에서 JSON.parse(JSON.stringify(object)) 또는 lodash 라이브러리의 _.cloneDeep() 메서드와 같은 깊은 복사를 수행하는 함수를 사용하여 객체를 복사할 때 깊은 복사가 수행된다.
const _ = require('lodash'); // lodash 라이브러리 로드
const originalObject = {
a: 1,
b: { c: 2 },
};
// 깊은 복사: _.cloneDeep() 사용
const deepCopyObject = _.cloneDeep(originalObject);
deepCopyObject.a = 3;
deepCopyObject.b.c = 4;
console.log(originalObject); // { a: 1, b: { c: 2 } }
console.log(deepCopyObject); // { a: 3, b: { c: 4 } }
- 'deepCopyObject'는 'originalObject'를 깊은 복사했기 때문에 모든 속성이 완전히 새로운 객체로 복사된다.
- 따라서 'deepCopyObject.b.c'를 변경해도 'originalObject.b.c'는 변경되지 않는다.
깊은 복사는 내용 자체(값 자체)를 복사함
배열, 객체 또한 값을 복사해서 새로운 배열, 객체를 동일하게 만들기 때문에 아예 별개의 변수이다.