확장메서드(Extension Methods)

2경빈·2024년 12월 18일

C#

목록 보기
6/14

확장 메서드(Extension Methods)는 기존 클래스에 새로운 메서드를 추가할 수 있는 기능이다.
이 기능을 통해, 원래의 클래스를 수정하지 않고도 그 클래스에 메서드를 추가할 수 있다. 주로 기존 클래스가 제공하는 기능에 추가적인 메서드를 제공할 때 유용하다.

확장 메서드의 특징

  1. 기존 클래스 수정 없이 기능 추가: 원래 클래스의 코드를 수정하지 않고 새로운 기능을 추가할 수 있다.
  2. this 키워드 사용: 확장하려는 타입을 첫 번째 파라미터로 받고, 그 파라미터 앞에 this 키워드를 붙여서 확장할 메서드를 정의한다.
  3. static 메서드: 확장 메서드는 항상 static 메서드여야 한다. 그래서 메서드를 정의할 때 static으로 선언해야 한다.

확장 메서드 사용 예시

예시 1: string 클래스에 ToFirstUpper 확장 메서드 추가

목표: string 클래스에 대해 첫 번째 문자를 대문자로 바꾸는 메서드를 추가하기.
기존의 string 클래스는 ToUpper와 같은 메서드는 있지만, 첫 번째 문자만 대문자로 바꾸는 기능은 없다.

확장 메서드 정의

public static class StringExtensions
{
    // string 클래스에 대해 첫 글자만 대문자로 바꾸는 확장 메서드 정의
    public static string ToFirstUpper(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return str;  // 비어 있거나 null일 경우 그냥 반환

        return char.ToUpper(str[0]) + str.Substring(1);  // 첫 글자를 대문자로 변경 후 나머지 문자열 추가
    }
}
  • this string str: string 타입을 확장하려고 this를 사용해서 str을 첫 번째 파라미터로 받는다.
  • 이 메서드는 string 클래스에 새로운 메서드를 추가한 것처럼 사용할 수 있게 한다.

확장 메서드 사용

class Program
{
    static void Main()
    {
        string myString = "hello";
        string result = myString.ToFirstUpper();  // 확장 메서드 호출
        Console.WriteLine(result);  // 출력: "Hello"
    }
}
  • myString.ToFirstUpper(): 기존 string 클래스에는 없던 ToFirstUpper() 메서드를 호출하여 첫 번째 문자를 대문자로 변경한 결과를 출력한다.

확장 메서드가 가능한 이유

  1. 정적 클래스와 메서드: 확장 메서드는 정적 클래스에 정적 메서드로 정의된다. 이 메서드는 this 키워드를 통해 메서드 호출 대상 객체(여기서는 string)를 첫 번째 매개변수로 받는다.
  2. 암묵적인 호출: 확장 메서드는 실제로는 호출하는 클래스에서 this 키워드를 사용하여 해당 타입을 확장한 것이므로, 확장된 메서드를 호출할 때 마치 원래 메서드처럼 사용할 수 있다. 즉, myString.ToFirstUpper()처럼 호출되지만, 내부적으로는 StringExtensions.ToFirstUpper(myString)처럼 동작한다.

예시 2: int 타입에 IsEven 확장 메서드 추가

int 타입에 대해 짝수인지 확인하는 IsEven 메서드를 확장하는 예제.

확장 메서드 정의

public static class IntExtensions
{
    public static bool IsEven(this int number)
    {
        return number % 2 == 0;  // 짝수이면 true 반환
    }
}
  • this int number: int 타입을 확장하려면 this int를 사용하여 해당 int 값에 메서드를 추가한다.

확장 메서드 사용

class Program
{
    static void Main()
    {
        int myNumber = 4;
        bool isEven = myNumber.IsEven();  // 확장 메서드 호출
        Console.WriteLine(isEven);  // 출력: True
    }
}
  • myNumber.IsEven(): int 클래스에 없는 IsEven() 메서드를 호출하여 짝수인지 여부를 확인할 수 있다.

확장 메서드가 왜 유용한가?

  1. 기존 클래스에 새로운 기능 추가: 기존 클래스를 수정할 수 없거나, 수정할 필요 없이 새로운 기능을 간단히 추가할 수 있다.
  2. 클린 코드: 확장 메서드를 사용하면 기능을 잘 분리할 수 있어, 코드가 깔끔하고 읽기 쉬워진다.
  3. 메서드 체이닝: 확장 메서드를 체이닝 형태로 사용할 수 있어 읽기 쉬운 코드를 작성할 수 있다.

예시 3: 메서드 체이닝

확장 메서드를 체이닝하여 사용할 수 있다. 예를 들어, 여러 문자열을 연속으로 처리하는 경우:

public static class StringExtensions
{
    public static string ToFirstUpper(this string str)
    {
        if (string.IsNullOrEmpty(str)) return str;
        return char.ToUpper(str[0]) + str.Substring(1);
    }

    public static string ToExclamation(this string str)
    {
        return str + "!";
    }
}
  • ToFirstUpper()ToExclamation() 두 개의 확장 메서드를 결합하여 사용할 수 있다.
class Program
{
    static void Main()
    {
        string myString = "hello";
        string result = myString.ToFirstUpper().ToExclamation();  // 체이닝
        Console.WriteLine(result);  // 출력: "Hello!"
    }
}

결론

확장 메서드는 기존 클래스에 새로운 메서드를 추가하는 기능으로, 정적 클래스에 this 키워드를 사용하여 구현한다. 이를 통해 원래 클래스를 수정하지 않고도 새로운 기능을 손쉽게 추가할 수 있다. 다양한 타입에 대한 확장 메서드를 정의하고 사용하면 코드 재사용성과 가독성을 높이는 데 유용하다.

profile
eggs before hatching

0개의 댓글