Shallow & Deep Copy

Shallow Copy

  • 객체를 복사할 때 원래값과 복사된 값이 같은 참조를 가리키고 있는 것
    • 객체의 ‘값’만 복사

Shallow Copy를 할 때 주의할 점

  • 포인터를 멤버함수로 두는 객체를 복사할 때
    • 복사 할 때마다 같은 객체를 가리키는 다수의 포인터 생김
  • 포인터가 가리키는 객체를 수정하면, 그 객체를 가리키는 다른 포인터들과 그 포인터를 멤버함수로 둔 객체들에 영향을 줄 수 있음

Deep Copy

  • ‘값’뿐만 아니라 포인터가 가리키는 객체까지 카피
    • 포인터를 멤버함수로 둔 클래스의 Deep copy는 메모리 할당이 필수
  • 깊은 복사된 객체
    • 객체안에 멤버 객체가 있을 경우, 원본과의 참조가 완전히 끊어진 객체
// 객체
class A
{	
  int a;
  B *b; // 또 다른 객체를 가리지는 포인터
  
  // 얇은 복사
  void shallow_copy(A other)
  {
    a = other.a;
    b = other.b; 
  }

  // 깊은 복사
  void deep_copy(A other)
  {
    a = other.a;
    // class B의 copy constructor 호출해서
    // 새로운 객체 B 생성, 멤버 변수 b에 할당
    b = new B(*(other.b)); 
}

Categories: ,

Updated: