본문 바로가기
책/Effective C#

Effective C# - Item 28 확장 메서드를 이용하여 구체화된 제네릭 타입을 개선하라

by 코딩하는 돼징 2024. 1. 20.
반응형

기존에 사용중인 컬렉션 타입에 영향을 주지 않으면서 새로운 기능을 추가하고 싶다면 구체화된 컬렉션 타입에 대해 확장 메서드를 작성하면 된다.

public class Customer
{
    public string Name { get; set; }
}

확장 메서드를 사용하지 않는 경우

public class CustormerList : List<Customer>
{
    public void SendEmailCoupons(Coupon speicalOffer);
    public static IEnumerable<Customer> LostProspects();
}

확장 메서드는 IEnumerable를 기반으로 작성됐지만 파생 클래스에서 메서드를 추가하는 방식은 List를 기반으로 한다. List<T>는 IEnumerable<T>를 상속받고 있기 때문에 LINQ와 같은 이터레이터 메서드를 사용할 수 없다. 상속을 잘 못 사용한 예이다.


확장 메서드를 사용하는 경우

public static void SendEmail(this IEnumerable<Customer> customers, Coupon speicalOffer)
{
    foreach(var customer in customers)
    {
        Console.WriteLine($"Sending email to {customer.Name}");
    }
}
public static IEnumerable<Customer> LostProspects(this IEnumerable<Customer> targetList)
{
    return targetList.Where... 생략
}

이러한 확장 메서드를 사용하는 경우 어떤 컬렉션 타입이든 IEnumerable<Customer> 인터페이스를 구현하고 있으면 해당 메서드를 사용할 수 있다.


사용 예시

// 배열 사용 예시
var customerArray = new Customer[]
{
    new Customer { Name = "Piggy" },
    new Customer { Name = "Pig" },
    new Customer { Name = "Bob" }
};
customerArray.SendEmail("CouponNumber:123");
var lostProspectsArray = customerArray.LostProspects();
foreach (var customer in lostProspectsArray)
{
    Console.WriteLine(customer.Name);
}
// 리스트 사용 예시
var customerList = new List<Customer>
{
    new Customer { Name = "Piggy" },
    new Customer { Name = "Pig" },
    new Customer { Name = "Bob" }
};
customerList.SendEmail("CouponNumber:456");
var lostProspectsList = customerList.LostProspects();
foreach (var customer in lostProspectsList)
{
    Console.WriteLine(customer.Name);
}

결론

구체화된 제네릭 타입을 살펴보고 논리적으로 어떤 메서드가 추가돼어야 하는지 재검토 해야 한다. 구체화된 제네릭 타입을 상속하여 메서드를 추가하기보다는 확장 메서드를 구현하는게 훨씬 낫다.

 

 

 

 

본 게시글은 Effective C#을 읽고 정리하였습니다.

 

 

 

 

 

 

반응형

댓글