확장메서드에 대해서 익숙하지도, 사용해보지도 않았지만 정리해봅니다.

지금 사용하고 있는 framework에서 심심치 않게 볼 수 있었고, 나몰라라하면서 넘겨왔지만 하나하나 알아가는 재미가 있기 때문에 정리합니다.

 

확장메서드(Extension Method)란?

C# 3.0부터 지원해주는 메서드입니다. 그리고 특수한 종류의 static 메서드 입니다.

다른 클래스/구조체의 인스턴스 메서드인 것처럼 사용되는 기능을 제공합니다.

클래스/구조체/인터페이스 등에 적용할 수 있습니다.

 

 

사용하는 이유는?

이유는 알고 사용해야 합니다. .net framework에서 제공해주는 클래스/구조체, 이미 배포되어진 클래스/구조체는 더 이상 수정(?)할 수가 없습니다.

참조만 할 수 클래스/구조체에 이미 만들어진 메서드를 응용하거나 또 다른 메서드를 추가해서 사용할 수 있습니다.

우리가 자주 사용하는 int형이나 string형에도 확장메서드를 추가해서 사용할 수 있습니다.

 

여기서 잠깐, '상속을 이용해서 파생클래스내에서 메서드를 추가할 수도 있지 않은가?' 라는 생각을 가지실 수 있습니다.

상속을 이용하여 가능하지만, 구조체에서는 상속을 지원하지 않기 때문입니다.

그뿐만 아니라 sealed class 에서도 파생클래스를 만들 수 없기 때문에 여러 제약이 있는 상속보다는 확장메서드를 사용하는 것이 더 좋습니다.

 

조건은 무엇인가?

그러면 확장메서드를 사용할때, 지켜야할 제약 조건 3가지가 있습니다.

1. 확장메서드를 가진 클래스는 static class 이어야 합니다.
2. 확장메서드는 static method 이어야 합니다.
3. 확장메서드의 첫번째 파라미터에는 this라는 지시어가 들어가야 합니다.

 

위의 조건을 따져가면서 새롭게 클래스를 만들어 보았습니다.

static 클래스추가!

메서드도 반환타입 앞에 static 추가, 그리고 this 지시어를 넣어주었습니다.

 

 

그러면 int형 변수에서 아래처럼 메서드를 확인해보면 IsEven이라는 메서드가 생긴것을 확인할 수 있습니다.

 

 

여기서 IsEven 메서드 앞에 화살표가 있는 것들은 확장메서드이고,

CompareTo처럼 화살표가 없는 것들은 해당 클래스/구조체 에 정의된 메서드입니다.

 

 

 

예제

// static 클래스안에 있는 확장메서드
/// <summary>
/// int형의 짝수 여부를 나타냅니다.
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public static bool IsEven(this int num) => num % 0 == 0;

/// <summary>
/// 기존문자열과 새로운문자열 사이 콤마를 추가해줍니다.
/// </summary>
/// <param name="str">기존 문자열입니다.</param>
/// <param name="text">새로운 문자열입니다.</param>
/// <returns></returns>
public static string CommaAppend(this string str, string text) => $"{str}.{text}";


// 다른 클래스에서 호출
var num = 1;
if (num.IsEven()) {
   Console.Write("even");
}

var str = "cmang9";
str.CommaAppend("tistory");

IsEven과 CommaAppend 라는 확장 메서드를 만들었습니다. (간단하게 만들었습니다.)

그리고 num(int형), str(string형)에서 각각 확장 메서드를 호출해서 사용하였습니다.

int형은 구조체, string형은 sead 클래스로 상속으로는 불가능하였지만, 확장 메서드를 사용해서는 새롭게 메서드를 추가/수정해서 만들 수 있었습니다.

+ Recent posts