얕은 복사 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);
}
\=== 주의할 점 ===
- 얕은 복사는 메모리 관리 문제로 인해 의도하지 않은 오류를 발생시킬 수 있으므로 주의가 필요하다.
- 얕은 복사는 주로 데이터를 실제 복제하지 않고 자료구조의 참조 정보를 전달할 때 사용된다. 복사된 객체를 삭제할 때는 원본 데이터에 영향이 없도록 특별히 신경 써야 한다.
- 실무에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 깊은 복사를 사용하는 것이 바람직하다.
\=== 참고 자료 ===
- \[\[코딩 인터뷰 완전분석]]