다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
제네릭을 사용한다면 공용 메서드를 작성할 수 있기 때문에 코드의 양이 줄어들게 된다.
하지만 공용으로 처리되기 때문에 특정 타입에 더 효율적으로 작동하는 알고리즘이 존재한다면,
특정 타입을 위한 구현을 별도로 작성하는 것이 성능에 이점을 줄 수 있다.
예시 : IEnumerable<T>와 IList<T>
IEnumerable<T>를 사용하는 메소드를 만들고 있다고 가정하자.
특정 메소드에서 IList<T> 타입 객체를 사용하면 랜덤엑세스를 사용할 수 있게되어 코드가 단축될 수 있다.
(List<T>인터페이스는 IEnumerable<T>의 하위 인터페이스이다.)
그런데 제네릭의 인스턴스는 런타임의 타입을 고려하지 않으며, 컴파일타임 타입만을 고려한다.
IList<T> 타입의 매개변수를 취하는 생성자 오버로드 외에도 런타임 타입을 확인하도록 코드를 작성해야한다.
public ReverseEnumerable(IEnumerable<T> sequence)
{
sourceSequence = sequence;
originalSequence = sequence as IList<T>;
}
public ReverseEnumerable(IList<T> sequence)
{
sourceSequence = sequence;
originalSequence = sequence;
}
결론
타입 매개변수로 지정될 가능성이 있는 타입들의 특성을 고려하여, 개별 타입에 최적화된 코드를 작성할 수 있다.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[21] 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.04.27 |
---|---|
[20] IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.04.26 |
[18] 반드시 필요한 제약조건만 설정하라 (0) | 2021.04.26 |
[17] 표준 Dispose 패턴을 구현하라 (0) | 2021.04.26 |
[16] 생성자 내에서는 절대로 가상 함수를 호출하지 말라 (0) | 2021.04.26 |