생각보다 spread
연산자, Object.assign
을 이용하는 경우가 많은데, 얕은 복사와 깊은 복사의 차이점에 대해서 정확히 파악하고 사용하고자 글을 작성한다.
참조를 복사
하는 방식이다.동일한 객체
를 가리키게 된다.최상위 속성만
을 복사하고, 내부 객체
나 배열
의 참조는 공유
한다.✅
참조를 공유
한다.....?
참조를 공유한다
는 말은 쉽게 말해서 복사본의 depth가 있는 대상의 속성을 변경하면, 그참조를 공유
하고 있는원본
의 동일한 객체의 속성도변경
된다는 뜻이다.
// ✅ 예시 1
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'running'] };
// 얕은 복사
const shallowCopy = { ...originalObject };
shallowCopy.name = 'Jane';
shallowCopy.hobbies.push('cooking');
console.log(originalObject.name); // 'John'
console.log(originalObject.hobbies); // ['reading', 'running', 'cooking']
// ✅ 예시 2
const a = {b : {c: 'c'}, e: 'e'};
const b = {...a};
b.e = 'd'
a // { b: { c: 'c' }, e: 'e' }
b // { b: { c: 'c' }, e: 'd' }
==================================
b.b.c = 'qqq'
a // { b: { c: 'qqq' }, e: 'e' } (원본까지 변경)
b // { b: { c: 'qqq' }, e: 'd' }
위의 코드를 보면 1depth인 e 값을 바꾸면 b의 값만 바뀌지만
key 값이 b의 c의 값을 바꾸면 a 변수의 값도 바뀌어 버린다.
1 depth 까지만 깊은 복사가 이루어 지는 것이다.
결과적으로
얕은 복사
를 수행할 때, 복사 대상 객체의최상위
속성은 값으로 복사되어불변성을 유지
하지만,내부
객체나 배열은동일한 참조
를공유
하므로 복사본에서 해당 속성을 변경하면원본
객체의 해당 속성도 동일하게변경
된다.
const originalObject = { name: 'John', age: 30, hobbies: ['reading', 'running'] };
// 깊은 복사
const deepCopy = JSON.parse(JSON.stringify(originalObject));
deepCopy.name = 'Jane';
deepCopy.hobbies.push('cooking');
console.log(originalObject.name); // 'John'
console.log(originalObject.hobbies); // ['reading', 'running']
결과적으로
깊은 복사
는 객체의모든
속성과 하위 항목을 복사하여완전한 독립성
을 제공하는 반면,얕은 복사
는최상위 수준의 속성만
을 복사하고내부 항목
은참조를 공유
한다. 따라서, 객체 구조에 따라 적절한 복사 방식을 적절히 선택해서 사용하면 좋을 것 같다.