1 분 소요

[C#02] C# 깊은복사, 얕은복사

깊은복사(Deep Copy)

깊은 복사는 원본 객체의 내부 구조와 데이터를 완전히 복사하여 새로운 독립적인 객체를 생성하는 방법입니다. 이렇게 복사된 객체는 원본 객체와는 완전히 분리되어 있으며, 내부에 포함된 모든 객체나 데이터까지도 복사됩니다. 깊은 복사는 원본 객체와 복사된 객체 간의 독립성을 보장하며, 한 객체를 수정해도 다른 객체에는 영향을 주지 않습니다.

코드


class MyClass
{
    public int x;
    public int y;

    public MyClass DeepCopy()
    {
        var copy = new MyClass();
        copy.x = this.x;
        copy.y = this.y;

        return copy;
    }
}

static void Main(stirng[] args)
{
    MycClass myClass = new MyClass();
    myClass.x = 10;
    myClass.y = 20;

    var copy = myClss.DeepCopy();
    copy.x = 30;
}

결과

myClass.x = 10 / myClass.y = 20 | copy.x = 30 / copy.y = 20

얕은복사(Shallow Copy)

얕은 복사는 원본 객체의 참조(주소)만을 복사하여 새로운 객체를 생성하는 방법입니다. 원본 객체와 복사된 객체는 같은 내부 데이터를 가리키게 되므로, 하나의 객체를 수정하면 다른 객체에도 영향을 미칩니다. 객체의 내부에 포함된 참조된 객체들은 공유되기 때문에 이들의 변경도 모든 객체에 영향을 미칩니다.

코드


class MyClass
{
    public int x;
    public int y;    
}

static void Main(string[] args)
{
    MyClass myClass = new MyClass();
    myClass.x = 10;
    myClass.y = 20;

    var copy = myClass;
    copy.x = 30;
}

결과

myClass.x = 30 / myClass.y = 20 | copy.x = 30 / copy.y = 20

ICloneable

C#에서 제공하는 인터페이스 중 하나로 객체의 복사본을 생성하는 메서드를 제공해야 합니다.

인터페이스 정의

namespace System
{
    public interface ICloneable
    {
        object Clone();
    }
}

코드

public class MyClass : IClonebale
{
    public int x;
    public int y;

    public object Clone()
    {
        //얕은 복사
        return this.MemberwiseClone();
    }

}

얕은 복사는 MemberwiseClone 메서드를 사용하여 가능합니다. 깊은 복사는 내부 참조 타입 메버들을 새로 생성하고 복사해야 합니다.