Extension Method..?

확장 메서드란, 기존 클래스의 기능을 확장하는 기능으로 상속과는 전혀 다르다.

새 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 추가할 수 있다.

확장 메서드는 정적 메서드이지만 확장 형식의 인스턴스 메서드인 것처럼 호출된다..!

쉽게 말해서 이미 존재하는 String클래스나, 이미 제작된 클래스에 메서드를 외부에서 추가하여 기존에 있던 기능처럼 동작하게 할 수 있다.

확장메서드를 만들기

  1. 확장메서드가 포함될 정적클래스를 정의한다.

정적클래스이기 때문에 액세스 가능한 영역을 잘 생각해서 만들 것

  1. 클래스와 동일한 표시 유형으로 확장 메서드를 구현한다.

  2. 메서드의 첫 번째 매개 변수는 메서드가 작동하는 형식을 지정한다. (this한정자가 앞에 와야함)

  3. 호출 코드에 using지시문을 추가하여 확장메서드를 포함하는 네임스페이스를 지정한다.

  4. 인스턴스 메서드인 것처험 메서드를 호출한다.

MyExtensions정적 클래스

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' },
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

Main

using ExtensionMethods;

namespace Programs
{
    class Program
    {
        static void Main()
        {
            string s = "Hello Extension Methods";
            int i = s.WordCount();
            System.Console.WriteLine(i);
        }
    }
}

3

동작 과정

string s = "Hello Extension Methods";
int i = s.WordCount();

코드에서 인스턴스 메서드 구문을 사용하여 확장 메서드를 호출한다..

컴파일러에서 생성된 IL(중간언어)이 코드를 정적메서드 호출로 변환한다.

즉, 이 형태는 아래와 동일하다.

string s = "Hello Extension Methods";
int i = MyExtensions.WordCount(s);

사실 static Method가 상태를 저장하거나 참조하여 변경하지 않는 순수 함수형으로만 사용한다면 크게 문제가 될것은 없다.

static자체의 사용이 거의 없어야 하지만 위와 같이 해당 클래스에서 메서드를 확장할 때는 유용하게 사용 가능하다.

하지만 어셈블리자체가 달라지게 된다면 디버깅 단계에서 작동을 안할 수 있다.

따라서 1.단계에서 잘 생각하고 만들어야 한다.

또한 객체지향레벨에서도 크게 이점이 없는 이유는 반복적이지만 애초에 해당 클래스에 붙어있는 메서드가 아닌 static메서드이기 때문에 본질 자체가 다르다.


  • https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

댓글남기기