자바스크립트에서 얕은복사와 깊은 복사는 객체나 배열을 복사하는 방법을 뜻한다.
얕은복사 (Shallow copy)
- 얕은복사는 객체의 1차원 속성만 복사한다. 객체 내의 참조타입 속성(ex. 배열, 객체 등)은 복사되지 않고 원본 객체의 참조를 공유한다.
- Object, assign(), 스프레드 연산자(...), Array, property.slice() 등을 사용해서 얕은복사를 수행할 수 있다.
const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };
shallowCopy.a = 10; // 원본에는 영향 없음
shallowCopy.b.c = 20; // 원본도 영향을 받음
console.log(original.b.c); // 20
✅장점
- 간단하고 빨라서 성능이 좋다.
- 객체의 속성이 단순한 경우에는 충분히 유용하다.
⛔단점
- 참조 타입의 속성에 대한 변경이 원본 객체에 영향을 미칠 수 있다.
깊은 복사(Deep copy)
- 깊은 복사는 객체의 모든 속성을 재귀적(recursive, 자기 자신을 이용하여 정의하거나 응용하는 성질)으로 복사한다. 중첩된 객체나 배열도 완전히 새로운 복사본이 생성된다.
- 일반적으로 JSON.parse(JSON.stringify()) 방법이나, 라이브러리(ex. Lodash의 _.cloneDeep())를 사용하여 수행할 수 있다.
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.a = 10; // 원본에는 영향 없음
deepCopy.b.c = 20; // 원본에도 영향 없음
console.log(original.b.c); // 2
✅장점
- 중첩된 객체나 배열의 변경이 원본 객체에 영향을 미치지 않아 안전하다.
⛔단점
- 성능이 떨어질 수 있고 특히, 큰 객체를 복사할 때 느려질 수 있다.
- JSON.stringify()를 사용할 경우, 함수, undefined, symbol, 순환참조를 복사할 수 없다.
결론
- 속성이 단순하고 참조 타입의 영향을 걱정하지 않아도 될 때 => 얕은 복사
- 중첩된 구조에서 안전하게 데이터를 복사하고 싶을 때 => 깊은 복사 (단, 성능저하와 제한사항이 있을 수 있다.)
'코린이 개념잡기 > JavaScript' 카테고리의 다른 글
웹 브라우저의 동작 원리 (1) | 2024.12.28 |
---|---|
var, let, const (0) | 2024.12.28 |
==와 ===의 차이 (0) | 2024.12.20 |
자바스크립트 모듈 (0) | 2024.12.19 |
배열 메소드 Ⅵ (map, set) (0) | 2024.12.19 |