확장 메서드(Extension Method)
확장 메서드는 C# 3.0에 추가된 새로운 기능으로 클래스 또는 인터페이스를 상속하거나 재구성하지 않고 클래스에 메서드를 추가할 수 있습니다.
확장 메서드는 클래스의 소스 코드를 수정할 수 없거나 변경할 권한이 없는 경우 클래스의 기능을 확장하는 방법으로 사용할 수 있습니다.
다음은 확장 메서드를 이해하기 위한 예제입니다. OriginClass라는 클래스에는 Print1(), Print2(), Print3() 메서드가 존재합니다.
public class OriginClass
{
public void Print1()
{
Console.WriteLine("Print1() Method Call");
}
public void Print2()
{
Console.WriteLine("Print2() Method Call");
}
public void Print3()
{
Console.WriteLine("Print3() Method Call");
}
}
OriginClass 클래스에 Print4(), Print5() 메서드를 추가하고 싶은데, 클래스를 수정할 수 있는 권한이 없으므로 확장 메서드를 사용합니다.
ExtensionMethod라는 정적 클래스를 만들고 아래 코드를 적용합니다.
public static class ExtensionMethod
{
public static void Print4(this OriginClass O)
{
Console.WriteLine("Print4() Method Call");
}
public static void Print5(this OriginClass O, String str)
{
Console.WriteLine("Print5() Method Call");
Console.WriteLine("Print5() Param: " + str);
}
}
Main() 메서드에서 OriginClass 클래스의 객체를 생성하고 Print4(), Print5() 메서드를 호출합니다.
class Program
{
static void Main(string[] args)
{
OriginClass originClass = new OriginClass();
originClass.Print4();
originClass.Print5("Hello!");
}
}
실행 결과
Print4() Method Call
Print5() Method Call
Print5() Param: Hello!
확장 메서드 특징
- 확장 메서드는 기존 클래스에 존재하지 않습니다.
- 확장 메서드는 정적 클래스에서 정의해야 합니다.
- 정적 클래스와 기존 클래스에 동일한 메서드가 존재하는 경우 기존 클래스의 메서드를 호출합니다.
- 확장 메서드의 첫 번째 매개변수를 바인딩 매개변수라고 하며, 이 매개변수의 타입은 바인딩되어야 하는 클래스입니다. 클래스 이름 앞에 this 키워드가 존재해야 합니다.
- 두 번째 매개변수부터 일반 매개변수를 추가할 수 있습니다.
확장 메서드 예제
C#의 string은 .Net Framework에서 기본으로 제공하는 클래스입니다. string 클래스의 소스 코드를 변경할 수 없으므로 확장 메서드를 사용하여 메서드를 확장할 수 있습니다.
Space의 갯수를 반환하는 GetSpaceCount() 메서드를 확장합니다.
public static class ExtenstionString
{
public static int GetSpaceCount(this string str)
{
if(!string.IsNullOrEmpty(str))
{
string[] spaceArray = str.Split(" ");
return spaceArray.Length - 1;
} else
{
return 0;
}
}
}
확장 메서드를 만들었으므로 Main() 메더스에서 문자열 객체를 생성하고 확장 메서드를 호출합니다.
class Program
{
static void Main(string[] args)
{
string str = "ABC DEF GHI JKL";
Console.WriteLine(str.GetSpaceCount());
}
}
실행 결과
3
정리
- 확장 메서드는 기존 클래스를 수정하지 않고 메서드를 확장할 수 있습니다.
- 정적 클래스에서 확장 메서드를 정의해야 합니다.
- .Net Framework에서 제공하는 기본 클래스의 기능을 확장하고 싶은 경우 확장 메서드를 사용할 수 있습니다.
반응형
'C#' 카테고리의 다른 글
[C#]Thread 생성자(Thread Constructor) (0) | 2022.05.28 |
---|---|
[C#]캡슐화(Encapsulation) (0) | 2022.05.25 |
[C#]중첩 클래스(Nested Class) (0) | 2022.05.19 |
[C#]Partial 클래스(Partial Class) (0) | 2022.05.18 |
[C#]메서드 숨기기(Method Hiding) (0) | 2022.05.16 |
댓글