[C#] ICloneable 인터페이스를 이용한 객체 복사
2020. 5. 19. 08:58
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
구현 방법
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
'Program Language > C#' 카테고리의 다른 글
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
---|---|
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
[C#] MSBuild 빌드 시 C# 언어 버전 변경 (0) | 2020.03.26 |
[C#] C#에서 unsafe 키워드 사용 방법 (0) | 2020.03.10 |
[C#] SQL Injection 예방 코드 (1) | 2020.02.12 |