2021
04.26

다음 본문은 도서 이펙티브 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;
}

 

결론

 타입 매개변수로 지정될 가능성이 있는 타입들의 특성을 고려하여, 개별 타입에 최적화된 코드를 작성할 수 있다.

 

 

COMMENT