본문 바로가기

[C#] 객체 얕은 복사(Shallow Copy) 깊은 복사(Deep Copy)

C#
·
2019. 12. 3. 10:17
반응형

얕은 복사(Shallow Copy)

얕은 복사는 객체의 참조만 복사하는 것입니다.
객체를 얕은 복사 하게 되면 스택에 있는 참조를 복사하게 됩니다.
복사할 객체(source)의 참조값을 복사될 객체(target)에 대입하게 됩니다.

다음은 얕은 복사의 예제 코드입니다.

public class Employee
{
    public int No;
    public string Name;
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = source;
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}

출력 결과

2, SSABI
2, SSABI

source를 생성한 후 targetsource를 복사하면 source의 참조값을 복사해서 target에 대입하게 됩니다.
따라서 실제로 객체는 2개가 생성된 것이 아닌 sourcetarget은 동일한 객체를 가리키고 있기 때문에 sourcetarget은 같은 값을 출력하게 됩니다.

얕은 복사

깊은 복사(Deep Copy)

깊은 복사는 객체를 복사해서 새로운 객체를 만드는 것입니다.
객체를 깊은 복사 하게 되면 복사할 객체(source)와 똑같은 복사본을 만들어서 복사될 객체(target)복사할 객체(source)와는 다른 복사본의 참조값을 대입하게 됩니다. 깊은 복사는 사용자가 직접 구현해야 합니다.

다음은 깊은 복사의 예제 코드입니다.

public class Employee
{
    public int No;
    public string Name;

    public Employee DeepCopy()
    {
        Employee employee = new Employee();
        employee.No = No;
        employee.Name = Name;

        return employee;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = source.DeepCopy();
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}

출력결과

1, Sana
2, SSABI

source를 생성한 후 targetsource를 복사하게 되면 새로운 객체를 만들고 새로 만들어진 객체의 참조값을 target에 대입하게 됩니다.

깊은 복사

ICloneable

ICloneable은 C#에서 제공하는 깊은 복사를 위한 인터페이스입니다.
깊은 복사를 구현하고자 한다면 .NET 프레임워크의 호환성을 위해서 ICloneable을 상속해서 Clone() 메소드 안에 깊은 복사를 구현하는 것이 좋습니다. 일반적으로는 Clone() 메소드는 깊은 복사를 구현합니다. 하지만 반드시 깊은 복사만 구현할 필요는 없습니다.

다음은 ICloneable을 상속해서 깊은 복사를 구현하는 예제 코드입니다.

public class Employee : ICloneable
{
    public int No;
    public string Name;

    public object Clone()
    {
        Employee employee = new Employee();
        employee.No = No;
        employee.Name = Name;

        return employee;
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Employee source = new Employee();
        source.No = 1;
        source.Name = "Sana";

        Employee target = (Employee)source.Clone();
        target.No = 2;
        target.Name = "SSABI";

        Console.WriteLine(source.No + ", " + source.Name);
        Console.WriteLine(target.No + ", " + target.Name);
    }
}
반응형
블로그 이미지
Frontend Engineer

댓글