dev/asp.net, c#

[c#] 객체의 value 복사 방법 - 복사생성자 Reflection 이용, ICloneable 구현 이용

코딩for 2022. 12. 5. 17:48
반응형

 

 객체의 값 복사하는 방법

 

 객체는 참조타입이기때문에 대입 연산자를 이용하여 값을 할당하면 객체의 주소값이 할당이되어

할당된 객체는 동일한 값을 바라보게 된다.  (얕은복사 라고 한다.)

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} ");

 

 

ICloneable 인터페이스 (System)

복제(클래스에서 기존 인스턴스와 같은 값을 갖는 새 인스턴스를 만듦)를 지원합니다.

learn.microsoft.com

 

 

반응형