[C#] ICloneable 인터페이스를 이용한 객체 복사

728x90
반응형

List<T> 혹은 Dictionary 자료구조를 이용해서 Referance Class를 Add 할 경우, 간혹 실수 하는 부분이 있습니다. 

Add 시점에 값을 변경할 경우, 기존에 Add 한 영역까지 참조 값이 바뀌는 부분인데요. 

 

 

 

new 키워드를 이용해서 반복적으로 Add할 경우에는 문제가 없지만, 

foreach ( var item in listData )
{
    gamePlayData.Add( new Item{ Index = eventCount++, Score = score } );
}

 

 

 

부득이하게, Global로 선언된 변수를 Add 하는 시점에 값을 변경하는 경우가 발생합니다. 

foreach ( var item in listData )
{
    item.Index = eventCount++;
    item.Score = score;
    
    gamePlayData.Add( item );
}

이럴 경우, listData가 여러개를 가지고 있다면, 기존의 Add 한 item까지 같은 값으로 참조값이 변경되어 집니다. 

예제는 간단한 class를 이용해서 new 키워드를 이용해서 값을 넣어도 상관없지만, 

 

class의 크기가 많다면, 코드량이 상당이 증가하게 될텐데요.

이 경우 ICloneable 인터페이스를 이용하게 손쉽게 해결이 가능합니다. 

 

 


IClonealbe

해당 인터페이스를 사용하면, 기존 개체의 복사본을 만드는 사용자 지정 구현을 제공할 수 있습니다.
ICloneable 인터페이스에는 Object.MemberwiseClone에서 제공 하는 것 이상의 복제 지원을 제공 하기 위한 Clone 메서드인 하나의 멤버가 포함 되어 있습니다.  
복제, 전체 복사본 및 단순 복사본 및 예제에 대 한 자세한 내용은 Object.MemberwiseClone 메서드를 참조 하세요.

위 내용이 MSDN에 설명되어져 있는 내용입니다. 

 

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.icloneable?view=netcore-3.1

 

ICloneable 인터페이스 (System)

복제(클래스에서 기존 인스턴스와 같은 값을 갖는 새 인스턴스를 만듦)를 지원합니다.Supports cloning, which creates a new instance of a class with the same value as an existing instance.

docs.microsoft.com

 


구현 방법

Clone 를 이용하려는 Class 에 IClonealbe 인터페이스를 참조하고, Clone() 메소드를 구현하면 됩니다. 

이때 MemberwiseClone() 메소드를 이용하시면, 현재 Object의 단순 복사본을 만듭니다.

public class Item : ICloneable
{
    public int Index { get; set; }
    public int Score { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}
728x90