방프리

21.03.28 Chapter3. 제네릭 활용 (Item 25) 본문

C#/Effective C#

21.03.28 Chapter3. 제네릭 활용 (Item 25)

방프리 2021. 3. 28. 12:53

Item 25 : 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라

 

저자는 제네릭을 사용할수록 개발자가 점점 실수를 할 수 있는 부분에 대해 염려한 것 같다.

이번 주제는 한마디로 줄이자면 편함을 버리자는 것이다.

아무 생각 없이 제네릭 클래스를 만드는 습관의 위험성인데 제네릭 클래스를 관리하다보면

제약조건이 점점 늘어날 수 있는데 그럴 경우마다 수정의 범위가 넓어진다.

public static class Utils
{
    public static T Max<T>(T left, T right) =>
    	Comparer<T>.Default.Compare(left, right) < 0 ? right : left;
    
    public static double Max(double left, double right) => 
    	Math.Max(left, right);
        
    public static T Min<T>(T left, T right) => 
    	Comparer<T>.Default.Compare(left, right) < 0 ? left : right;
        
    public static double Min<T>(double left, double right) =>
    	Math.Min(left, right);
}

제네릭 클래스 대신 제네릭 메서드를 통해서 타입별로 구현하는 것이 앞으로의 사용에 좀 더 최적화가 될 뿐만 아니라 

작업량이 더 줄어들게 된다. (제네릭 클래스로 구현 시 사용할 때마다 타입을 지정해야함)

하지만 다음의 경우에는 제네릭 메서드보다는 제네릭 클래스를 구현하는 것이 더 장점일 때가 있다.

  • 클래스에 타입 매개변수로 주어진 타입으로 내부 상태를 유지 (컬렉션이 예시)
  • 제네릭 인터페이스를 구현하는 클래스를 만들어야 할 경우 

자신이 구현해야하는 제품의 조건을 잘 고려하여 선택하자.

Comments