얕은 복사 vs 깊은 복사

기술노트
Admin (토론 | 기여)님의 2025년 5월 5일 (월) 07:50 판
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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

주의할 점

  • 얕은 복사를 사용할 때는 메모리 관리 문제로 인해 의도하지 않은 오류가 발생할 수 있으므로 매우 신중하게 사용해야 한다.
  • 얕은 복사는 실제 데이터를 복제하지 않고 자료구조의 참조 정보만 전달할 때 주로 사용된다. 복사된 객체를 삭제할 때는 원본 데이터가 삭제되지 않도록 반드시 주의해야 한다.
  • 실제 개발 현장에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 더욱 깊은 복사를 사용하는 것이 권장된다.

참고 자료