8월 26일 - 얕은 복사 vs 깊은 복사

Yullgiii·2024년 8월 26일
0

[Cpp] 얕은 복사 vs 깊은 복사

shallow copy와 deep copy가 어떻게 다른지 알아보자

얕은 복사(shallow copy)

  • 얕은 복사는 한 객체의 모든 멤버 변수의 값을 다른 객체로 복사하는 것을 의미한다.
  • 단순히 포인터의 주소값만 복사하며, 실제 메모리의 데이터는 복사되지 않는다.

깊은 복사(deep copy)

  • 깊은 복사는 모든 멤버 변수의 값뿐만 아니라, 포인터 변수가 가리키는 모든 객체에 대해서도 복사하는 것을 의미한다.
  • 새로운 메모리 공간을 할당하여, 해당 공간에 데이터를 복사한다.

코드 예제

#include <iostream>
#include <cstring>

struct Test {
    char *ptr;
};

void shallow_copy(const Test &src, Test &dest) {
    dest.ptr = src.ptr;
}

void deep_copy(const Test &src, Test &dest) {
    dest.ptr = new char[strlen(src.ptr) + 1]; // 메모리 할당
    strcpy(dest.ptr, src.ptr); // 실제 데이터를 복사
}

int main() {
    Test original;
    original.ptr = new char[20];
    strcpy(original.ptr, "Hello, World!");

    Test shallow;
    Test deep;

    // 얕은 복사
    shallow_copy(original, shallow);

    // 깊은 복사
    deep_copy(original, deep);

    // 원본 객체와 복사된 객체의 값 비교
    std::cout << "Original: " << original.ptr << std::endl;
    std::cout << "Shallow Copy: " << shallow.ptr << std::endl;
    std::cout << "Deep Copy: " << deep.ptr << std::endl;

    // 원본 객체의 메모리 해제
    delete[] original.ptr;

    // 얕은 복사된 객체를 사용하면 문제가 발생할 수 있다.
    std::cout << "After deleting original:" << std::endl;
    std::cout << "Shallow Copy: " << shallow.ptr << std::endl;
    std::cout << "Deep Copy: " << deep.ptr << std::endl;

    // 깊은 복사된 객체의 메모리 해제
    delete[] deep.ptr;

    return 0;
}

코드 설명

  • shallow_copy 함수: shallow_copy 함수는 포인터의 주소값만 복사한다. 이 경우 두 객체는 같은 메모리 공간을 공유하게 되어, 하나의 객체에서 메모리를 해제하면 다른 객체에서 사용할 수 없게 된다.
  • deep_copy 함수: deep_copy 함수는 새로운 메모리 공간을 할당하고, 데이터를 복사하여 두 객체가 서로 다른 메모리 공간을 사용하도록 한다.

So...

얕은 복사(shallow copy)는 포인터 변수가 가리키는 메모리 주소만 복사하기 때문에, 메모리 해제 시 문제가 발생할 수 있다. 이로 인해 객체의 생명주기와 관련된 복잡한 문제들이 발생할 수 있다. 반면 깊은 복사(deep copy)는 새로운 메모리 공간을 할당하여 데이터를 복사하므로, 메모리 관리가 보다 안전하게 이루어진다. 실무에서는 대부분의 경우 깊은 복사를 사용하는 것이 권장된다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글