C# - Extension Method [확장메서드]
C# 프로그래밍을 하다보면 자주 사용하는 기능은 함수로 만들어서 사용하게 됩니다. 하지만 함수는 특정 클래스에 종속적이기 때문에 사용하는데 어느정도 제한이 있습니다. 그래서 이런 경우 필요한 기능이 바로 확장 메서드 (Extension Method) 입니다.
확장메서드는 클래스, 인터페이스, 구조체 등 다양한 타입에 대해서 함수를 추가할 수 있는 기능인데요. 프로그래밍을 하다보면 내가 짠 코드가 아닌 다른사람이 만든 코드를 이용하는 경우가 꽤 많은데요. 이때 코드를 보고 추가할 수 있는 상황도 있지만, dll을 참조하거나 nuget package를 이용해서 다른 기능을 사용하는 경우 자신이 필요한 기능이 있어도 추가하기 어렵습니다.
이럴때는 확장메서드를 이용해서 추가할 수 있습니다.
그렇다면 확장메서드를 만드는 방법을 알아보도록 하겠습니다.
확장메서드를 만들기 위해서는 정적 클래스가 하나 필요합니다. 정적이란, static으로 선언된 클래스입니다. 정적클래스는 빌드하는 과정에서 미리 메모리를 할당하기 때문에 모든 곳에서 사용될 확장메서드는 미리 정의가 되어야합니다.
그리고 확장메서드는 this를 이용해서 어떤 타입에 확장메서드를 만들지 선택하는 것입니다.
밑에 예제를 보면 Enum에 대해서 Description을 가져오는 예제입니다.
우선 클래스인 Program을 보면 정적(static)으로 선언된 것을 알 수 있습니다. 그리고 함수도 static으로 선언되었습니다. 그 다음에는 반환 받을 타입을 설정하고 함수의 이름을 만들게 됩니다.
그리고 this 라는 키워드가 오고 Enum 이라는 Class에 확장메서드를 만들게 됩니다. 이렇게 하면 모든 Enum 타입에서 이 함수를 사용할 수 있습니다. 만약에 확장메서드에 파라미터를 넣고 싶다면 this 뒤에 파라미터를 넣으면 됩니다. 아래는 stringFormat을 파라미터로 하는 함수입니다.
확장메서드는 정말 다양한 곳에서 사용할 수 있기 때문에 자주 사용되는 기능입니다. 공용으로 사용되는 기능은 이런식으로 미리 만들어놓으면 필요할때 바로바로 사용할 수 있기 때문에 아주 좋아요.
실제로 Color 라는 Enum 이 있다고 할때 어떻게 사용하는지 보도록 하겠습니다.
현재 Color 라는 Enum은 제가 만든 Enum인데요.
C#에서 제공하는 Enum인 BindingFlags라는 Enum도 같은 방법으로 확장 메서드가 적용됩니다.
제가 만든 enum이 아니더라도 함께 적용되는 것을 볼 수 있습니다. 점말 좋은 기능이죠?
한가지 단점이라면 프로젝트가 나눠지게 되면 관리하는데 조금 더 신경을 써야한다는 것이 있긴 한데요. 이건 큰 단점은 아니기 때문에 충분히 잘 활용할 수 있는 기능이라고 생각하네요.