[로봇활용_9주차] C# 확장 메서드(Extension Method)

최윤호·2025년 10월 8일
post-thumbnail

기능을 확장하는 방법?

혹시 C#을 사용하시다가 이런 생각해 보신 적 없나요?
"string클래스에 단어 수를 세는 메서드가 있었으면..."
하지만 C#에서 string이나 int처럼 이미 정의된 기능은
우리가 마음대로 수정할 수 없습니다. 소스 코드를 건드릴 수 없으니까요.
이럴 때 필요한 기능이 바로 확장 메서드(Extension Method)입니다!

확장 메서드란?

확장 메서드는 기존에 존재하는 클래스, 구조체, 인터페이스의 소스 코드를
직접 수정하지 않고 새로운 기능을 추가할 수 있는 C#의 특별한 기능입니다.
static메서드로 정의되지만, 마치 그 타입에 포함된 인스턴스 메서드인 것처럼
자연스럽게 호출할 수 있다는 것이 가장 큰 특징입니다. 이 덕분에 우리는
직접 수정할 수 없는 코드(예: .NET 프레임워크, 외부 라이브러리)에도
원하는 기능을 손쉽게 확장할 수 있습니다.
LINQ의 수많은 메서드들(Where, Select등)은 확장 메서드로
구현되어 있으며, 확장 메서드의 강력함을 가장 잘 보여주는 예시입니다.

1)확장 메서드의 3가지 규칙

확장 메서드를 만드는 방법은 간단합니다.
1. static클래스 안에 선언해야 합니다.
2. 메서드 자신도 static으로 선언해야 합니다.
3. 첫 번째 매개변수 앞에 this키워드를 붙여야 합니다.

2)string을 확장하는 예제

문자열이 숫자로만 이루어져 있는지 판별하는
IsNumeric()메서드를 string클래스에 추가해 보겠습니다.

[코드]

using System;

// 1. 반드시 static 클래스여야 합니다.
// 클래스 이름은 자유롭게 지을 수 있지만, '타입 + Extensions' 형식을 권장합니다.
public static class StringExtensions
{
    // 2. 메서드도 static이어야 합니다.
    // 3. 첫 매개변수에 'this'를 붙여 확장할 타입을 명시합니다.
    public static bool IsNumeric(this string sourceText)
    {
        if (string.IsNullOrEmpty(sourceText))
        {
            return false;
        }

        // int.TryParse를 사용해 문자열이 정수로 변환 가능한지 확인
        return int.TryParse(sourceText, out _);
    }
}

class Program
{
    static void Main()
    {
        string text1 = "12345";
        string text2 = "HelloWorld";
        string text3 = null;

        // 마치 string의 원래 멤버 메서드처럼 호출할 수 있습니다.
        bool isNumber1 = text1.IsNumeric(); // true
        bool isNumber2 = text2.IsNumeric(); // false
        bool isNumber3 = text3.IsNumeric(); // false

        Console.WriteLine($"'{text1}'는 숫자입니까? {isNumber1}");
        Console.WriteLine($"'{text2}'는 숫자입니까? {isNumber2}");
        Console.WriteLine($"'{text3}'는 숫자입니까? {isNumber3}");
    }
}

[실행 결과]

'12345'는 숫자입니까? True
'HelloWorld'는 숫자입니까? False
''는 숫자입니까? False

3)내부 동작 원리

사실 컴파일러는 내부적으로 아래와 같은 static메서드 호출로 바꿔줍니다.
우리가 편리하게 쓸 수 있도록 문법 설탕(Syntactic Sugar)을 제공하고 있어요.

// 입력한 코드
bool isNumber1 = text1.IsNumeric();
// 컴파일러가 변환하는 실제 코드
bool isNumber1 = StringExtensions.IsNumeric(text1);

4)언제 사용하면 좋을까요?

확장 메서드는 다음과 같은 상황에서 유용합니다.

  • 외부 라이브러리 또는 .NET 기본 클래스 확장
    소스 코드를 수정할 수 없는 클래스에 메서드를 추가하고 싶을 때 사용합니다.
  • 인터페이스의 기본 구현 제공
    LINQ처럼, 인터페이스에 공통 기능을 추가할 때 유용합니다.
  • 코드의 가독성 향상
    ConvertToInt(myString)보다는 myString.ToInt()형태가
    객체 중심적으로 읽히고 이해하기 쉽습니다.
profile
🚀 미래의 엔지니어를 꿈꾸는 훈련생의 기록 📝

0개의 댓글