본문 바로가기
C#/Effective C#

[Effective C#] Item27 인터페이스는 간략히 정의하고 기능의 확장은 확장 메서드를 사용하라.

by 코모's 2022. 10. 26.
반응형

확장 메서드를 이용하면 인터페이스에 새로운 동작을 추가할 수 있다. 인터페이스에는 가능한 한 최소한의 기능만을 정의하고, 확장 메서드를 세트로 함게 구현하면 손쉽게 기능을 확장할 수 있다. 특히 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

반응형