
혹시 C#을 사용하시다가 이런 생각해 보신 적 없나요?
"string클래스에 단어 수를 세는 메서드가 있었으면..."
하지만 C#에서 string이나 int처럼 이미 정의된 기능은
우리가 마음대로 수정할 수 없습니다. 소스 코드를 건드릴 수 없으니까요.
이럴 때 필요한 기능이 바로 확장 메서드(Extension Method)입니다!
확장 메서드는 기존에 존재하는 클래스, 구조체, 인터페이스의 소스 코드를
직접 수정하지 않고 새로운 기능을 추가할 수 있는 C#의 특별한 기능입니다.
static메서드로 정의되지만, 마치 그 타입에 포함된 인스턴스 메서드인 것처럼
자연스럽게 호출할 수 있다는 것이 가장 큰 특징입니다. 이 덕분에 우리는
직접 수정할 수 없는 코드(예: .NET 프레임워크, 외부 라이브러리)에도
원하는 기능을 손쉽게 확장할 수 있습니다.
LINQ의 수많은 메서드들(Where, Select등)은 확장 메서드로
구현되어 있으며, 확장 메서드의 강력함을 가장 잘 보여주는 예시입니다.
확장 메서드를 만드는 방법은 간단합니다.
1. static클래스 안에 선언해야 합니다.
2. 메서드 자신도 static으로 선언해야 합니다.
3. 첫 번째 매개변수 앞에 this키워드를 붙여야 합니다.
문자열이 숫자로만 이루어져 있는지 판별하는
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
사실 컴파일러는 내부적으로 아래와 같은 static메서드 호출로 바꿔줍니다.
우리가 편리하게 쓸 수 있도록 문법 설탕(Syntactic Sugar)을 제공하고 있어요.
// 입력한 코드
bool isNumber1 = text1.IsNumeric();
// 컴파일러가 변환하는 실제 코드
bool isNumber1 = StringExtensions.IsNumeric(text1);
확장 메서드는 다음과 같은 상황에서 유용합니다.
ConvertToInt(myString)보다는 myString.ToInt()형태가