확장 메서드를 이용하면 인터페이스에 새로운 동작을 추가할 수 있다. 인터페이스에는 가능한 한 최소한의 기능만을 정의하고, 확장 메서드를 세트로 함게 구현하면 손쉽게 기능을 확장할 수 있다. 특히 API를 추가적으로 정의하지 않고도 새로운 기능을 추가할 수 있다.
예시 : IEnumerable<T>
system.Linq.Enumerable 클래스가 이 기법을 활용한 대표적인 예다. System.Enumerable에는 IEnumerable<T>에 정의된 50개 이상의 확장 메서드가 포함되어 있다. Where, OrderBy, GroupInfo 등이 있다.
이처럼 IEnumerable<T>에 대해 확장 메서드를 정의하면 이미 IEnumerable<T>를 구현하고 있는 클래스 수정할 필요가 없다. 이전과 동이하게 GetEnumerator()만 구현하면 충분하다. IEnumerator<T>를 구현할 때도 Current, MoveNext(), Reset()만 구현하면 된다. 별도의 구현 없이도 추가된 확장 메서드를 이용하여 컬렉션에 대해서 다양한 쿼리 연산을 수행할 수 있다.
새로운 인터페이스를 작성할때도!
새로운 인터페이스를 작성할대도 동일한 패턴을 사용할 수 있다. 인터페이스는 정말 딱 필요한 기능만 포함하도록 하고 다양한 기능을 제공하는 메서드는 전부 확장메서드로 돌리는 것이다.
이런 패턴을 적용하면 필수로 작성해야 하는 메서드의 수도 줄일 수 있고 사용자에게 더 풍부한 기능을 제공할 수 있다.
예시
public interface IFoo
{
int Marker {get; set;}
}
//확장메서드
public static class FooExtensions
{
public static void NextMarker(this IFoo thing) =>
thing.Marker += 1;
}
static class Program
{
static void Main(string[] args)
{
MyType myType = new MyType();
mytype.NextMarker();
Console.WriteLin($"{myType.Marker}");
}
}
public class MyType : IFoo
{
public int Marker { get; set; }
}
확장 메서드 참고 자료 : https://www.csharpstudy.com/CSharp/CSharp-extension-method.aspx
'C# > Effective C#' 카테고리의 다른 글
[Effective C#] Item 29 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다. (0) | 2022.11.07 |
---|---|
[Effective C# Item 28] 확장 메서드를 이용하여 구체화된 제네릭 타입을 개선하라. (1) | 2022.10.28 |
[Effective C#] Item26 제네릭 인터페이스와 논 제네릭 인터페이스를 함께 구현하라 (0) | 2022.10.26 |
[Effective C#] Item 25 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2022.10.25 |
[Effective C#] Item24 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라 (0) | 2022.10.25 |