다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
확장 메서드를 이용하면 인터페이스의 기능을 손쉽게 확장할 수 있다.
System.Linq.Enumerable 클래스가 대표적인 예다.
IEnumerable<T>는 기본적인 구현만 가지고 있으며,
Where, OrderBy, ThenBy, GroupInfo 등은 확장 메서드로 구현되어있다.
확장의 예시
- IComparable<T>의 경우 left.CompareTo(right) 와 같은 형태로 사용하며 리턴되는 값이
left가 right보다 작은 경우 0보다 작은 값을 반환한다.
- 이 경우 익숙하지않은 개발자에게는 혼란을 줄 여지가 있다. 아래와 같이 기존 메서드를 활용하여 확장 메서드로 재정의한다면 실수로 사용하는 일은 줄어들게 될 것이다.
public static class Comparable
{
public static bool LessThan<T>(this T left, T right)
where T : IComparable<T> => left.CompareTo(right) < 0;
}
확장 메서드와 내부 메서드의 충돌
- 특정 인터페이스에 대해 구현한 확장 메서드와 클래스 내부 메서드의 이름이 겹칠경우 문제가 생길 수 있다.
- 이 경우 의미적으로 완전히 동일한 작업을 수행하도록 작성해야한다.
결론
- 인터페이스의 멤버의 수를 최소한으로 줄이고, 추가 기능은 확장 메서드를 활용하라.
이를 통해 반드시 작성해야 하는 코드의 양을 줄이고 풍부한 기능을 제공할 수 있다.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[29] 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다 (0) | 2021.04.28 |
---|---|
[28] 확장 메서드를 이용하여 구체화된 제네릭 타입을 개선하라 (0) | 2021.04.28 |
[26] 제네릭 인터페이스와 논제네릭 인터페이스를 함께 구현하라 (0) | 2021.04.28 |
[25] 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2021.04.27 |
[24] 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라 (0) | 2021.04.27 |