Home Full Site
C# 확장 메서드 (Extension Method)

C# 3.0부터 지원하는 확장메서드(Extension Method)는 특수한 종류의 static 메서드인데, 확장메서드는 마치 다른 클래스(혹은 구조체)의 인스턴스 메서드인 것처럼 사용되는 기능을 제공한다. 확장메서드는 클래스, 구조체, 인터페이스 등에 적용될 수 있다.

일반적으로 인스턴스 메서드를 추가하기 위해서는 해당 클래스 (혹은 타입) 안에 메서드를 추가한다. 하지만, 어떤 경우는 메서드를 클래스 (혹은 타입)에 직접 추가하는 것이 어려울 수도 있는데, 이러한 경우 확장메서드가 유용하게 사용될 수 있다. 확장메서드를 사용하면 클래스를 직접 변경하지 않고도, 클래스 외부에서 (확장)메서드를 정의함으로 해서 마치 그 클래스의 기능을 확장한 인스턴스 메서드를 추가한 것 같은 효과를 낼 수 있다.

확장메서드는 static class 안에 static method로 정의된다. 확장메서드는 첫번째 파라미터로 항상 클래스명(혹은 타입)을 지정하는데, 이는 그 확장메서드가 사용될 클래스 타입을 지정하는 것이다. 이를 통해 확장메서드는 마치 그 클래스의 인스턴스 메서드인 것처럼 사용할 수 있게 된다. 약간 특이한 문법이지만, 확장 메서드의 첫번째 파라미터의 클래스명 바로 앞에는 항상 this를 써준다.

아래 예제는 .NET의 String 클래스를 첫번째 파라미터로 갖는 확장메서드로서, String 클래스에서만 동작하는 확장메서드를 정의한 예이다. ToChangeCase(this String str) 메서드는 파라미터가 하나로서 String 클래스에서 사용되는 확장메서드이며 그 메서드는 다른 입력파라미터를 갖지 않지만, Found(this String str, char ch) 메서드는 String 클래스에서 사용되는 확장메서드로서 char 문자 하나를 입력파라미터로 받아들이는 메서드이다.


예제

using System;
using System.Text;

namespace MySystem
{
   // static class를 정의
   public static class ExClass
   {
      // static 확장메서드를 정의. 첫번째 파라미터는
      // 어떤 클래스가 사용할 지만 지정.
      public static string ToChangeCase(this String str)
      {
         StringBuilder sb = new StringBuilder();
         foreach (var ch in str)
         {
            if (ch >= 'A' && ch <= 'Z')
               sb.Append((char)('a' + ch - 'A'));
            else if (ch >= 'a' && ch <= 'z')
               sb.Append((char)('A' + ch - 'a'));
            else
               sb.Append(ch);
         }
         return sb.ToString();
      }

      // 이 확장메서드는 파라미터 ch가 필요함
      public static bool Found(this String str, char ch)
      {
         int position = str.IndexOf(ch);
         return position >= 0;
      }
   }

   class Program
   {
      static void Main(string[] args)
      {
         string s = "This is a Test";
        
         // s객체 즉 String객체가
         // 확장메서드의 첫 파리미터임
         // 실제 ToChangeCase() 메서드는
         // 파라미터를 갖지 않는다.
         string s2 = s.ToChangeCase();

         // String 객체가 사용하는 확장메서드이며
         // z 값을 파라미터로 사용
         bool found = s.Found('z');
      }
   }
}





© csharpstudy.com