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));
}