얕은 복사 vs 깊은 복사
기술노트
[Cpp] 얕은 복사 vs 깊은 복사
얕은 복사(shallow copy)와 깊은 복사(deep copy)의 차이점과 사용 시 주의할 점에 대해 알아보자.
얕은 복사(shallow copy)
얕은 복사는 객체의 멤버 변수 값을 다른 객체로 복사하는 방법이다. 특히 포인터 변수를 복사할 때, 실제 데이터가 아니라 주소만 복사하기 때문에, 두 객체는 동일한 데이터를 공유하게 된다. 이로 인해 데이터가 변경되거나 삭제될 경우 원본 객체와 복사본 객체 모두 영향을 받을 수 있다.
깊은 복사(deep copy)
깊은 복사는 객체의 멤버 변수뿐 아니라, 포인터 변수가 가리키는 데이터까지 모두 별도의 공간에 완전히 복사한다. 이렇게 복사된 객체는 원본 객체와 독립적이므로, 한 객체의 데이터 변경이 다른 객체에 영향을 미치지 않는다.
예시 코드
#include <cstring>
#include <cstdlib>
struct Test {
char *ptr;
};
// 얕은 복사
void shallow_copy(Test &src, Test &dest) {
dest.ptr = src.ptr;
}
// 깊은 복사
void deep_copy(Test &src, Test &dest) {
dest.ptr = (char*)malloc(strlen(src.ptr) + 1);
strcpy(dest.ptr, src.ptr);
}
주의할 점
- 얕은 복사를 사용할 때는 메모리 관리 문제로 인해 의도하지 않은 오류가 발생할 수 있으므로 매우 신중하게 사용해야 한다.
- 얕은 복사는 실제 데이터를 복제하지 않고 자료구조의 참조 정보만 전달할 때 주로 사용된다. 복사된 객체를 삭제할 때는 원본 데이터가 삭제되지 않도록 반드시 주의해야 한다.
- 실제 개발 현장에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 더욱 깊은 복사를 사용하는 것이 권장된다.