방프리
23.12.17 Chapter2. API 설계 (Item 24) 본문
Item 24 : 설계 선택지를 제한하는 ICloneable은 사용을 피하라
복사를 지원해야하는 타입에서 ICloneable은 좋은 선택지이다. 하지만 해당 타입이 상속 계통상에 있는 타입이라면?
조금 사용하는 것에 있어서 고려를 해보아야 한다.
타입의 멤버가 값타입이라면 ICloneable을 지원할 필요가 없다. ICloneable에 있는 Clone()은 object 형태이기 때문에
박싱 언박싱으로 인해 연산량이 더 오래 걸려 굳이 사용할 필요가 없다. 하지만 string과 같은 참조 타입이 있을 경우
Clone()을 사용하게 되는데 이때에도 깊은 복사를 지원하는지 살펴볼 필요가 있다.
만약 파생 계층에 있는 타입에서 ICloneable을 지원하게 한다면 모든 파생 클래스들에서 Clone()을 구현해야 한다.
그렇지 않으면 지원하는 타입에 따라 객체가 생성되지 않는 참조 멤버변수가 발생할 수 있기 때문이다.
class BaseType
{
private string label;
private int[] values;
protected BaseType()
{
label = "class name";
values = new int[10];
}
protected BaseType(BaseType right)
{
label = right.label;
values = right.values.Clone() as int[];
}
}
sealed class Derived : BaseType, ICloneable
{
private double[] dValues = new double[10];
public Derived()
{
dValues = new double[10];
}
private Derived(Derived right) :
base(right)
{
dValues = right.dValues.Clone() as double[];
}
public object Clone()
{
Derived rVal = new Derived(this);
return rVal;
}
}
ICloneable 사용 시 주의할 점
1. 어떤 규칙에 의해 사용하기 보다는 예외적인 상황에 대응하기 위함
2. ICloneable은 값 타입에 추가해서는 안됨 (연산량 부하가 오히러 더 많음)
3. 해당 타입이 복사 연산을 지원해야 하며 최말단 클래스에서만 추가
4. 베이스 클래스가 파생 클래스에서 사용할만하다면 protected로 복사 생성자 미리 생성
'C# > More Effective C#' 카테고리의 다른 글
24.01.02 Chapter2. API 설계 (Item 26) (0) | 2024.01.02 |
---|---|
24.01.01 Chapter2. API 설계 (Item 25) (0) | 2024.01.01 |
23.12.12 Chapter2. API 설계 (Item 23) (0) | 2023.12.12 |
23.11.12 Chapter2. API 설계 (Item 22) (0) | 2023.11.12 |
23.08.20 Chapter2. API 설계 (Item 21) (0) | 2023.08.20 |
Comments