[C#] 35. 확장 메서드를 사용하는 방법


Study/C#  2021. 9. 23. 16:55

안녕하세요. 명월입니다.


이 글은 C#에서 확장 메서드를 사용하는 방법에 대한 글입니다.


제가 이전에 C#에서 메서드(함수)를 사용하는 방법에 대해 설명한 적이 있습니다.

링크 - [C#] 08. 함수(Method)와 오버로딩과 재귀 호출


함수라는 것은 클래스 내에서 데이터를 변형하거나 처리하는 기능이 있는 처리식입니다.

클래스를 선언해서 함수를 만들고, 클래스 외부에서 호출하는 것에 대해서는 잘 알고 있습니다.


그런데 우리가 프로젝트 내에서 만든 클래스가 아닌 .Net framework에서 제공하는 클래스나 외부 라이브러리에서 가져온 클래스에 함수를 붙이고 싶을 때는 어떻게 할까?

using System;

namespace Example
{
  class Program
  {
    //String 타입의 데이터를 int형으로 변환하는 함수
    static int ConvertToIntFromString(String val, int def = -1)
    {
      try
      {
        // 변환
        return Convert.ToInt32(val);
      }
      catch
      {
        // 에러가 발생하면 기본 데이터를 리턴 (default: -1)
        return def;
      }
    }
    // 실행 함수
    static void Main(string[] args)
    {
      // string 타입의 값은 1
      var data = "1";
      // string에서 int 타입으로 변환
      var ret = ConvertToIntFromString(data);
      
      // ret 변수의 자료형
      Console.WriteLine("ret data type = " + ret.GetType());
      // 값을 출력
      Console.WriteLine("ret value = " + ret);
      // 아무 키나 누르면 종료
      Console.WriteLine("Press Any key...");
      Console.ReadLine();
    }
  }
}

위 예제는 기본적인 함수 생성과 사용법입니다.

그런데 조금 더 편하게 사용하기 위해서 ConvertToIntFromString 함수가 String 클래스의 함수처럼 만들고 싶습니다.

using System;

namespace Example
{
  // 확장 함수를 넣기 위한 static class 생성
  static class ExpendFunction
  {
    // 기본 함수 형태에 첫번째 파라미터에 this를 넣으면 string 클래스의 확장 클래스가 된다.
    // String 타입 데이터를 int형으로 변환하는 함수
    public static int ConvertToIntFromString(this String val, int def = -1)
    {
      try
      {
        // 변환
        return Convert.ToInt32(val);
      }
      catch
      {
        // 에러가 발생하면 기본 데이터를 리턴 (default: -1)
        return def;
      }
    }
  }
  class Program
  {
    // 실행 함수
    static void Main(string[] args)
    {
      // string 타입의 값은 1
      var data = "1";
      // string에서 int 타입으로 변환 (확장 함수)
      var ret = data.ConvertToIntFromString();
      // ret 변수의 자료형
      Console.WriteLine("ret data type = " + ret.GetType());
      // 값을 출력
      Console.WriteLine("ret value = " + ret);
      // 개행
      Console.WriteLine();
      // string에서 int 타입으로 변환 (일반 함수 호출식)
      ret = ExpendFunction.ConvertToIntFromString(data);
      // ret 변수의 자료형
      Console.WriteLine("ret data type = " + ret.GetType());
      // 값을 출력
      Console.WriteLine("ret value = " + ret);
      // 아무 키나 누르면 종료
      Console.WriteLine("Press Any key...");
      Console.ReadLine();
    }
  }
}

첫번째 예제와의 차이는 확장 함수를 static class 함수에 생성해야 합니다.

static이 붙으면 프로그램이 기동될 때 일괄적으로 읽게 되어 있는데, 그때 기존의 String 클래스에 함수를 추가하는 역할을 하는 것 같습니다.


확장 함수는 static으로 생성해야 하는 것, 첫번째 파라미터에 this를 붙이면 해당 클래스의 확장 함수가 되는 것입니다.

사용법은 string에서의 함수처럼 사용이 가능하네요.

Visual studio의 인텔리젼스(자동 완성 기능)에도 함수가 있는 것으로 제어가 되네요.

그리고 확장 함수로 설정해 놓아도 기존 방법처럼 일반 함수를 호출하는 형식으로도 사용도 가능합니다.


프로젝트에서 기존의 경우, 처리만 하는 함수는 Util이나 Common, Define의 클래스를 정의하여 한 곳으로 모아 사용하곤 했습니다.

이런 방식이 나쁘다는 것은 아닌데, 이렇게 확장 함수로 설정해 놓으면 가독성이나 소스 정리하는 데 많이 유용합니다.


여기까지 C#에서 확장 메서드를 사용하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.