카테고리 없음

얕은 복사, 깊은 복사

lamarcK 2025. 3. 24. 19:36

'얕은 복사(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'는 변경되지 않는다.

깊은 복사는 내용 자체(값 자체)를 복사함

배열, 객체 또한 값을 복사해서 새로운 배열, 객체를 동일하게 만들기 때문에 아예 별개의 변수이다.