- 할당처럼 완전히 독립적인 복사가 아닌 원본의 메모리 주소를 공유하기 때문에 복사한 객체에서 수정/삭제가 이뤄질 경우 원본에도 영향
- 할당처럼 값이 복사되어 독립적으로 작동 복사값에서 수정/삭제를 해도 원본에 영향 없음
- 참조를 공유한다는 건 메모리 주소를 공유한다는 의미
| 특징 | Shallow Copy | Deep Copy |
|---|
| 복사 방식 | 객체의 1단계 깊이까지만 복사 | 객체 내부의 모든 중첩 구조를 재귀적으로 복사 |
| 참조 관계 | 중첩된 객체는 참조를 공유 | 중첩된 객체도 새로운 복사본 생성 |
| 메모리 사용 | 상대적으로 적음 | 더 많이 사용 |
| 수정 영향 범위 | 중첩된 객체를 수정하면 원본에 영향을 미침 | 중첩된 객체를 수정해도 원본에 영향을 미치지 않음 |
| 사용 방법 예시 | Object.assign(), spread operator (...) | JSON.parse(JSON.stringify()), 재귀 함수 |
| 성능 | 빠름 | 느림 (특히 객체 구조가 깊을수록) |
const o1 = { x: { y: 1 } }
const obj = { a: 1, b: { c: 2 } };
const c1 = o1;
1. Object.assign
const copyObj == Object.assign({}, obj);
2. 전개 연산자로 복사
const shallowCopy = { ...obj };
shallowCopy.b.c = 42;
console.log(obj.b.c);
1. JSON.parse(JSON.stringify())
const obj = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(obj));
deepCopy.b.c = 42;
console.log(obj.b.c);
2. 재귀 함수로 구현
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) return obj.map(deepClone);
return Object.keys(obj).reduce((acc, key) => {
acc[key] = deepClone(obj[key]);
return acc;
}, {});
}
const obj = { a: 1, b: { c: 2 } };
const deepCopy = deepClone(obj);
deepCopy.b.c = 42;
console.log(obj.b.c);
3. lodash 활용
import _ from 'lodash';
const obj = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(obj);
deepCopy.b.c = 42;
console.log(obj.b.c);