반응형
객체의 값 복사하는 방법
객체는 참조타입이기때문에 대입 연산자를 이용하여 값을 할당하면 객체의 주소값이 할당이되어
할당된 객체는 동일한 값을 바라보게 된다. (얕은복사 라고 한다.)
CopyConstructor constructor = new CopyConstructor();
constructor.ordNo = 1;
CopyConstructor constructor1 = constructor;
Console.WriteLine("source : " + constructor.GetHashCode());
Console.WriteLine("target : " + constructor1.GetHashCode());
Console.WriteLine("source no : " + constructor.ordNo);
Console.WriteLine("target no : " + constructor1.ordNo);
// 원본의 값을 변경
constructor.ordNo = 2;
// source 의 값이 변경이 되면 target 도 함께 바뀐다.
Console.WriteLine("source no : " + constructor.ordNo);
Console.WriteLine("target no : " + constructor1.ordNo);
[ 객체의 값을 복사하는 방법 ]
- ICloneable 인터페이스를 구현하는 방법
- 복사 생성자에서 리플렉션을 통해 프로퍼티의 값을 하나씩 복사하는 방법
public class CopyConstructor : ICloneable
{
public CopyConstructor() { }
// 리플렉션을 통해서 객체의 멤버 복사
public CopyConstructor(CopyConstructor cart)
{
foreach (var p in this.GetType().GetProperties())
{
foreach (var c in cart.GetType().GetProperties())
{
if (p.Name == c.Name)
{
//Console.WriteLine();
p.SetValue(this, c.GetValue(cart));
}
}
}
}
// ICloneable 인터페이스 구현
public object Clone()
{
return this.MemberwiseClone();
}
public int ordNo { get; set; }
public int ordSq { get; set; }
public string UserId { get; set; }
public double Cnt { get; set; }
public string OrdSbc { get; set; }
public string Notice { get; set; }
}
// 리플렉션을 통해 값을 하나씩 복사
CopyConstructor constructor2 = new CopyConstructor(constructor1);
Console.WriteLine($"target2 : {constructor2.GetHashCode()}, {constructor2.ordNo} ");
// ICloneable 의 Clone 을 구현
CopyConstructor constructor3 = (CopyConstructor)constructor2.Clone();
Console.WriteLine($"target3 : {constructor3.GetHashCode()}, {constructor3.ordNo} ");
constructor2.ordNo = 10;
constructor3.ordNo = 20;
Console.WriteLine($"target2 : {constructor2.GetHashCode()}, {constructor2.ordNo} ");
Console.WriteLine($"target3 : {constructor3.GetHashCode()}, {constructor3.ordNo} ");
반응형