얕은 복사(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
를 생성한 후 target
에 source
를 복사하면 source
의 참조값을 복사해서 target
에 대입하게 됩니다.
따라서 실제로 객체는 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);
Console.WriteLine(target.No + ", " + target.Name);
}
}
출력결과
1, Sana
2, SSABI
source
를 생성한 후 target
에 source
를 복사하게 되면 새로운 객체를 만들고 새로 만들어진 객체의 참조값을 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);
}
}
댓글