이 방법은 최신 C# 에서 동작하지 않습니다.
조만간 다시 포스팅하겠습니다.
ICloneable 인터페이스는 단 한개의 메서드(Clone) 를 가지는 간단한 인터페이스입니다.
이름과 같이 기존 객체의 복사를 위한 Clone()을 구현하면 되는데 얕은 복사 (ShallowCopy)와 깊은 복사 (DeepCopy)를 적절하게 사용해야합니다. 얕은 복사와 깊은 복사에 대해서는 다음 포스팅에서 알아보고 이 포스팅에서는 ICloneable 구현 미세팁을 공유합니다.
✅ ICloneable.Clone() Return Type
Clone()을 그대로 구현하면 아래와 같은 형태가 됩니다.
public class Person : ICloneable
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public object Clone()
{
return new Person(Name, Age);
}
public override string ToString()
{
return $"Name: {Name}, Age: {Age}";
}
}
이 Clone()을 사용하면
Person p = new Person("a", 10);
Person clonep = (Person)p.Clone();
Clone()의 반환형이 object 이므로 이렇게 형변환을 해야합니다.
여간 귀찮은게 아닙니다.
방법 1
public class MyClass : ICloneable
{
public int MyProperty { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
public MyClass CloneMyClass()
{
return (MyClass)this.Clone();
}
}
위와 같은 형태로 사용하면 Clone() 대신 CloneMyClass()를 호출해서 Class 그대로를 받을 수 있습니다.
하지만 Clone()을 그대로 사용할 수 없기 때문에 마음에 쏙 들진 않습니다.
방법 2
약간의 속임수를 사용합니다.
public class MyClass : ICloneable
{
public int MyProperty { get; set; }
public MyClass Clone()
{
return this.MemberwiseClone();
}
public object ICloneable.Clone()
{
return Clone();
}
}
실제 Clone()은
public MyClass Clone()
{
return this.MemberwiseClone();
}
위 부분에서 수행되며 Class 그대로 반환이 됩니다.
도움이 되셨다면 커피 한 잔~!
✅ ICloneable.Clone() Return Type - 끝
관련 포스팅
추가 예정