이론

얕은 복사와 깊은 복사의 차이

TIN9 2023. 4. 18.
반응형

얕은 복사와 깊은 복사의 차이

얕은 복사

얕은 복사는 단순히 개체의 멤버 변수 값을 새 개체에 복사합니다.

그러나 멤버 변수가 포인터인 경우 새 개체는 원래 개체와 동일한 메모리 주소를 공유하게 됩니다.

즉, 원래 객체의 멤버 변수 값이 변경되면 새 객체의 멤버 변수 값도 변경이 됩니다.

 

깊은 복사

깊은 복사는 자체 멤버 변수 복사본을 사용하여 새 개체를 만듭니다. 멤버 변수가 포인터인 경우 새 객체는 별도의 메모리 주소를 갖게됩니다. 즉, 원래 개체에 대한 변경 사항은 새 개체에 영향을 주지 않습니다.

 

예시

#include <iostream>

class ShallowCopy
{
public:
    ShallowCopy(int* arr)
    {
        data = arr;
    }

    void printData() 
    {
        std::cout << "Data: " << *data << "\n";
    }

public:
    void Add()
    {
        *data += 1;
        return;
    }

private:
    int* data;
};
class DeepCopy
{
public:
    DeepCopy(int* arr)
    {
        data = new int;
        *data = *arr;
    }

    DeepCopy(const DeepCopy& other) 
    {
        data = new int;
        *data = *(other.data);
    }

    void printData()
    {
        std::cout << "Data: " << *data << "\n";
    }

    ~DeepCopy() 
    {
        delete data;
    }

public:
    void Add()
    {
        *data += 1;
        return;
    }

private:
    int* data;
};


int main() 
{
    int arr[1] = { 1 };

    ShallowCopy s1(arr);
    ShallowCopy s2 = s1;

    s1.printData(); // Output: Data: 1
    s2.printData(); // Output: Data: 1

    arr[0] = 2;

    s1.printData(); // Output: Data: 2
    s2.printData(); // Output: Data: 2 (because it's a shallow copy)

    s1.Add();
    s1.printData(); // Output: Data: 3
    s2.printData(); // Output: Data: 3 (because it's a shallow copy)

    std::cout << "ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ" << std::endl;


    DeepCopy d1(arr);
    DeepCopy d2 = d1;

    d1.printData(); // Output: Data: 3
    d2.printData(); // Output: Data: 3

    arr[0] = 4;

    d1.printData(); // Output: Data: 3
    d2.printData(); // Output: Data: 3 (because it's a deep copy)

    d1.Add();
    d1.printData(); // Output: Data: 4
    d2.printData(); // Output: Data: 3 (because it's a deep copy)

    return 0;
}

얕은복사의 경우 arr[0]의 값을 변경하거나 s1의 data값을 변경하니 s2의 data값도 자동으로 바뀌게 되는것을 볼 수 있습니다.

위에서 설명한것처럼 s1와 s2는 arr의 주소와 동일하고 arr, s1, s2중 하나의 데이터만 바뀌어도 전부 영향을 받게 됩니다.

다만 깊은 복사의 경우 arr의 값을 바꿔도 d1, d2는 영향 받지 않고 d1의 data값을 바꾼다고 해도 d2의 data값이 바뀌지 않는것을 볼 수 있습니다.

 


더보기

개인적인 공부목적으로 작성된 글입니다 틀린 부분이 있다면 지적 감사하겠습니다.

반응형

'이론' 카테고리의 다른 글

STL 컨테이너  (0) 2023.04.21
메모리 단편화  (0) 2023.04.18
오버로딩과 오버라이딩의 차이  (0) 2023.04.18
램버트 조명 공식  (0) 2022.08.09
렌더링 파이프라인 구조  (0) 2022.08.09

댓글