개발공부/C#

[Effective C#] 아이템 19 : 런타임에 타입을 확인하여 최적의 알고리즘을 사용하라

개발자 찐빵이 2021. 11. 25. 19:40
728x90

제네릭 타입

Generic Type Definition : 타입을 제네릭의 형태로 정의하는 것
Closed Generic Type : 타입 매개변수에 구체적인 타입을 지정한 경우
Open Generic Type : 여러 타입 매개변수 중 일부만 구체적인 타입을 지정한 경우

제네릭 타입의 타입 매개변수가 Value 타입일 때 장점

  1. 박싱과 언박싱을 피할 수 있다.
  2. 코드와 데이터의 크기가 줄어들고 성능이 개선된다.
  3. 컴파일러가 타입 매개변수에 대한 타입 안정성을 보장해준다.
  4. 런타임에 타입 유형을 매번 확인할 필요가 없다.

제네릭 타입의 장점

타입 매개변수에 새로운 타입을 지정하여 손쉽게 재사용할 수 있다.
타입 매개변수에 새로운 타입을 지정 = 유사한 기능을 가진 새로운 타입을 생성

타입, 메서드 제네릭화의 단점

  • 구체적인 타입이 주는 장점을 잃는다.
  • 타입의 세부 특성까지 고려하여 최적화한 알고리즘을 사용할 수 없다.
  • 그래서 만약 어떤 알고리즘이 특정 타입에 대해 더 효율적으로 동작한다고 생각하면 그냥 그 타입을 사용해라.*

예시

1. IEnumerable<T> 대신 IList<T> 사용하기

IEnumerable<T>를 사용했을 때 복제본을 만들어야 하고, 대부분의 컬렉션들이 랜덤 액세스를 지원하기 때문에 비효율적이다.
IList<T>를 사용하면 복제본을 만들 이유가 없어지고, 매개변수가 IList<T>타입인 것을 컴파일 타임에 알 수 있으므로 구현이 더 용이해진다.
IList<T> 객체라도 컴파일 타임에 IEnumerable<T>으로 간주될 경우를 대비하여 IList<T> 타입의 매개변수를 취하는 생성자 오버로드 메서드 외에도 런타임 타입을 확인하도록 코드를 작성한다.

마치기 전

ReverseEnumerable<T> 내에서 수행되는 매개변수에 대한 테스트는 모두 런타임에 이루어진다.
즉, 추가 기능을 확인하는 과정에 일정 부분 비용이 발생한다.
하지만 대부분 이 비용은 모든 요소를 복사하는 것에 비해 훨씬 적다.

반응형