C# 3.0 미리보기 : Extension Methods

2007. 6. 3. 21:23 IT 및 개발/.NET FX & Visual C#
이 팁은 Visual Studio Codename "Orcas"에서 사용되는 C# 입니다.
제 생각에는 C# 3.0이라고 생각되어 개인적으로 C# 3.0 미리보기라고 한것입니다.

작업 환경
- Windows Server 2003 Standard Service Pack 2
- Visual Studio Codename "Orcas"

세번째 시간입니다.
이번엔 Extension Methods에 대해서 알아보도록 하겠습니다.
이번 역시 설명보다는 예제로 설명을 하도록 하겠습니다.

일단 예제로 이메일 주소를 가지고 있는 string이 있습니다.
이 이메일 주소의 유효성 검사를 하는 클래스와 함수를 만들고 사용을 합니다.

string email = "shblitz@shblitz.net";
if ( EmailValidator.IsValid(email) )
{
}

위 예제는 EmailValidator라는 클래스에 IsValid라는 함수를 만들어서 email의 유효성을 검사하는 예제입니다.

C# 3.0에서는 저런 방법이 아니라 string이라는 객체에 함수를 추가하여 사용할 수 있도록 할 수 있습니다.
그러면 아래와 같은 방법으로 사용이 가능할 것입니다.

string email = "shblitz@shblitz.net";
if ( email.IsValidEmailAddress() )
{
}

실제적으로 string 객체에는 위에서 보는 봐야 같이 IsValidEmailAddress() 라는 함수는 없습니다.
이 함수는 사용자가 추가한 함수 입니다.

그러면 이젠 어떻게 추가를 하는지 알아보도록 하겠습니다.

새로운 클래스 파일을 생성 하신 후 아래와 같이 확장 메소드를 추가합니다.

public static class ShblitzExtensions
{
    public static bool IsValidEmailAddress(this string s)
    {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(s);
    }
}

위 예제를 보시면 이 함수는 string 객체에서 사용하고 결과 값으로 bool을 넘기는 것을 확인할 수 있습니다.

다음은 Visual Studio Codename "Orcas"에서 실제 사용되는 이미지다.

사용자 삽입 이미지

위 이미지에서 보는 것과 같이 string 객체에 IsValidEmailAddress라는 함수가 추가된것을 볼수 있다.
그리고 일반 함수와는 다르게 아이콘 모양도 다르며 풍선 도움말에는 (extension) 이라는 문구가 보인다.

위의 예제는 string 이라는 객체에 한해서 사용할 수 있는 예제입니다.
다음은 모든 객체에서 사용할 수 있는 확장 함수에 대해서 알아보도록 하겠습니다.

먼저 확장 메소드를 만듭니다.

using System;
using System.Collections;
namespace ShblitzExtensions
{
    public static class ShblitzExtensions
    {
        public static bool In(this object o, IEnumerable c)
        {
            foreach(object i in c)
            {
                if(i.Equals(o))
                {
                    return true;
                }
            }
           
            return false;
        }
    }
}

위 예제는 어떤 객체 리스트에 내가 지정한 객체가 포함이 되어 있는지 확인하는 예제입니다.
그러면 이젠 사용을 해보도록 하겠습니다.

예제는 숫자와 문자열에서 사용하는 방법입니다.

using System;
using ShblitzExtensions;
public class ShblitzTest
{
    // string 형에서 In 함수를 사용하는 예제
    public void TestUsage1()
    {
        string[] strList = { "One", "Two", "Three" };
        bool bTest1 = "One".In(strList);
       
        string strTest = "Four";
        bool bTest2 = strTest.In(strList);
    }

    // int 형에서 In 함수를 사용하는 예제
    public void TestUsage2()
    {
        int[] iList = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
       
        bool bTest1 = 3.In(iList);
       
        int iTest = 11;
        bool bTest2 = iTest.In(iList);
    }
}

위에서 보는 것과 같이 여러 객체 형에서 사용이 가능하기도 합니다.
이와 같이 사용하면 전에 사용하던 유틸 클래스 자체를 확장 함수 형식으로 변경을 해서 사용하면 편할거 같다고 생각이 듭니다.

이것으로 세번째 팁도 마치도록 하겠습니다.
다음 팁은 언제 올라올지 모르겠습니다. 아직 제가 해보지 못했거든요..
제가 해보고 이해를 하게 되면 올리도록 하겠습니다..

작성자 : 상현넘™ [SHBLITZ.NET]