ITEM 24 :: EFFECTIVE C#


안녕하세요, 24번째 시간입니다.


이번 챕터는 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라, 입니다. 이번 내용도 저번 내용과 같이 그리 많은 내용이 있지는 않지만, 알고 지나가면 좋을 정보입니다.

설명

제네릭 메서드가 등장함에 따라 여러 개의 오버로드 된 메서드가 있는 경우, 이 중 하나를 선택하는 과정이 꽤 복잡해졌다. 컴파일러는 제네릭 메서드의 타입 매개변수가 다른 타입으로 다양하게 변경될 수 있음을 고려하여 오버로드된 메서드 중 하나를 선택하기 때문이다.

따라서 제네릭 클래스나 제네릭 메서드를 작성할 때에는 사용자가 가능한 한 안전하고 혼돈스럽지 않도록 작성해야 한다. 특히 오버로드된 메서드가 여러 개인 경우, 컴파일러가 이중 하나를 어떻게 선택하는지 정확히 알고 있어야 한다. 그리고 사용자가 명시적으로 타입을 설정한 일반 메서드보다 제네릭 메서드가 우선적으로 선택되는 경우에 대해서도 명확히 이해하고 있어야 한다.

결론

1. 제네릭 메서드가 있는 경우 요청된 메서드의 원형과 정확히 일치하는 메서드를 생성할 것이므로, 베이스 클래스 타입의 매개변수를 취하는 메서드보다 우선적으로 선택된다.
2. 인터페이스의 경우 제네릭화 시키면 오류가 너무 많이 발생하므로 사용하지 않는 것을 권장한다. (예외로 정수타입만 문제가 없다.)
3. 만약 그럼에도 제네릭화 시키고 싶다면 모든 타입에 대해서도 특화를 수행해야 한다.