Shallow copy vs Deep copy

blimeyoops·2023년 8월 4일
0

c#

목록 보기
3/6
post-custom-banner

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); //출력: 2, SSABI
        Console.WriteLine(target.No + ", " + target.Name); //출력: 2, SSABI
    }
}

위 코드처럼 실제로 객체는 2개가 생성된 것이 아닌 source와 target은 동일한 객체를 가리키고 있기 때문에 source와 target은 같은 값을 출력하게 됩니다.

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); //출력: 1, Sana
        Console.WriteLine(target.No + ", " + target.Name); //출력: 2, SSABI
    }
}

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

ICloneable

ICloneable은 C#에서 제공하는 깊은 복사를 위한 인터페이스입니다. 깊은 복사를 구현하고자 한다면 ICloneable을 상속해서 Clone() 메소드 안에 깊은 복사를 구현하는 것이 좋습니다. 일반적으로는 Clone() 메소드는 깊은 복사를 구현합니다.

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); //출력: 1, Sana
        Console.WriteLine(target.No + ", " + target.Name); //출력: 2, SSABI
    }
}
post-custom-banner

0개의 댓글