확장 메서드(MSDN 링크) 는 C# 3.0부터 추가된 기능으로 미리 정의된 형식에 사용자 정의 함수를 확장(추가)시키는 작업을 수행한다. 예로 들어서 string 형식에 Print라는 함수를 확장할 때 일반적인 경우라면 형식에 메서드를 추가하기 위해서는 해당 형식의 소스 코드가 필요하다. string 형식은 mscorlib (Multi-language Standard Common Object Runtime Library, 다국어 표준 공용 언어 런타임 라이브러리) 프로젝트에 포함되어 있으며, 변경 후에는 이 프로젝트를 다시 빌드하여 어셈블리를 만들어야 한다. 깃헙 링크
하지만, 확장 메서드를 사용한다면 해당 형식의 코드를 변경하지 않고 내 코드에서 어떤 형식이던지 메서드를 확장시킬 수가 있게 된다.
확장 메서드는 정의는 정적으로, 사용은 인스턴스 메서드처럼 사용하게 된다.
정적 메서드는 해당 메서드를 정의하고 있는 클래스의 개체를 생성하지 않고 사용할 수 있다.
개체를 생성한다는 것은 new 키워드 등을 사용하여 클래스를 초기화하는 것을 의미한다. 단, new 키워드를 직접적으로 사용하지 않고 다른 메서드 등을 통해서 호출하는 경우에도 내부적으로는 new 키워드를 사용하므로 이 경우에 해당한다.
class ExampleClass {
public static void StaticMethod() {
Console.WriteLine("Hello from StaticMethod");
}
/* 중략 */
public static void Main(string[] args) {
ExampleClass.StaticMethod();
}
}
중요: 확장 메서드는 정적 클래스에서만 정의할 수 있다.사용하실 땐 확장 메서드를 정의하고 있는 클래스가 포함된 네임스페이스를 포함(using)해줌으로서 가능하다.
static class ExtensionMethods {
public static void Print(this string s) {
Console.WriteLine(s);
}
}
class ExampleClass {
public static void Main(string[] args) {
string text = "Hello from ExtensionMethods";
// 아래의 두 코드는 동일한 결과가 나옵니다.
"Hello from ExtensionMethods".Print();
text.Print();
}
}
확장 메서드는 정적 메서드처럼 정의하되, 첫번째 매개변수에는 어떤 형식의 확장 메서드인지를 결정하게 된다. this 형식 매개변수_이름 의 형태이고, 위 코드에서는 this string s 부분이 해당된다. 확장 메서드를 추가하기 전에는 string 형식에 Print 라는 메서드가 없지만, 확장 메서드를 추가한 이후에는 string 형식에 Print 라는 메서드가 생겨있는걸 볼 수가 있다.
미리 정의된 메서드와 확장 메서드는 아이콘으로도 구분되어 있다. 미리 정의된 메서드가 보라색 정육면체 아이콘이고, 확장 메서드는 아래 화살표가 추가되어 있다.
기존 정의된 메서드와 동일한 이름을 갖는 확장 메서드는 매개 변수의 형식과 갯수까지 같을 경우 기존 정의된 메서드가 실행된다. 확장 메서드의 우선 순위는 인스턴스 메서드보다 낮기 때문에 동일한 메서드 이름을 사용하는 것은 피해야 한다.
'프로그래밍 언어 > C#' 카테고리의 다른 글
C# 부분 클래스 (partial) (0) | 2022.07.19 |
---|---|
C# 인덱서 (Indexer) (0) | 2022.07.19 |
C# 리플렉션과 어트리뷰트 (Reflection and Attributes) (0) | 2022.07.08 |
C# 전처리기의 모든것 (0) | 2022.07.04 |
C# Action/Func/Predicate (0) | 2022.07.04 |