JS 얕은 복사, 깊은 복사

nubim·2025년 1월 24일
  • 할당처럼 완전히 독립적인 복사가 아닌 원본의 메모리 주소를 공유하기 때문에 복사한 객체에서 수정/삭제가 이뤄질 경우 원본에도 영향
  • 할당처럼 값이 복사되어 독립적으로 작동 복사값에서 수정/삭제를 해도 원본에 영향 없음
  • 참조를 공유한다는 건 메모리 주소를 공유한다는 의미
특징Shallow CopyDeep Copy
복사 방식객체의 1단계 깊이까지만 복사객체 내부의 모든 중첩 구조를 재귀적으로 복사
참조 관계중첩된 객체는 참조를 공유중첩된 객체도 새로운 복사본 생성
메모리 사용상대적으로 적음더 많이 사용
수정 영향 범위중첩된 객체를 수정하면 원본에 영향을 미침중첩된 객체를 수정해도 원본에 영향을 미치지 않음
사용 방법 예시Object.assign(), spread operator (...)JSON.parse(JSON.stringify()), 재귀 함수
성능빠름느림 (특히 객체 구조가 깊을수록)
const o1 = { x: { y: 1 } }
const obj = { a: 1, b: { c: 2 } };

// shallow copy
// c1을 수정하면 o1도 수정됨
// 같은 메모리를 참조하기 때문
const c1 = o1;

1. Object.assign
const copyObj == Object.assign({}, obj);

2. 전개 연산자로 복사
const shallowCopy = { ...obj };
// 전개 연산자로 복사하면 2단계 이상의 중첩된 객체를 수정할 경우 원본도 수정됨
shallowCopy.b.c = 42;
console.log(obj.b.c); // 42 (원본도 영향을 받음)
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 (원본은 영향을 받지 않음)

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); // 2

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); // 2

0개의 댓글