본문 바로가기

프로그래밍&IT/C#

[.Net C#] 확장메서드 (extension method)

.Net C# - 확장메서드(Extension method)를 사용해보자.


.Net 3.5버전부터 새로 추가된 기능입니다.


기존에 사용되거나 만들어진 클래스, 구조체, 인터페이스 구현 혹은 타입을 직접 변경하지않고 기능을 확장해 사용하는 방법입니다.

Int같은 데이터타입이나 만들어진 Class에도 적용이 가능합니다.



몇가지 알아야 할 점들이 있습니다.

* 확장메서드는 정적 클래스의 멤버로 정의해야한다.

* 확장메서드의 첫번째 매개변수는 this 키워드를 한정자로 써야한다 (그리고 첫번째만)

Ex) 

static class TestExtension {

public static void DisplayMethod(this object obj) { ... }

...

}

* 현재 메모리상에 존재하는 객체의 인스턴스를 통해 확장메서드를 부를 수 있고

정적클래스를 통해 정적으로 호출할 수 있다.



Case 1. int에 추가메서드를 추가하기

첫번째로 우리가 많이 쓰는 int 타입에다가 단순히 n값을 출력하는 함수 (DisplayMyIntList)를 추가해보겠습니다.


먼저 확장메서드 추가전의 int내 멤버함수들입니다.

아직은 정의된 확장메서드가 보이지 않습니다.


[int 타입 확장메서드 추가전]


이제 아래처럼 static class & method로 정의된 확장메서드를 코딩하면

이제 추가된 확장함수명이 보이며 사용할 수 있게됩니다.


그런데 this로된 매개변수를 하나 정의했는데,

실제로 매개변수가 없는 함수로 보입니다.


[int 타입 확장메서드 추가]


위에 써놓은 확장메서드 사용시 알아야할 점에서 써두었던 내용 중

* 확장메서드의 첫번째 매개변수는 this 키워드를 한정자로 써야한다 (그리고 첫번째만)

이 항목과 관련있는것같은데요.


즉 처음에 this로 정해진 타입 (object, int, string 등) 은 매개변수라기보단
확장메서드가 확장하고자 하는 타입으로 보시면 될것같습니다.
object로 할경우 훨씬 다양하게 확장할 수 있겠죠.

아래처럼 int값의 매개변수를 사용하고 싶을 경우에는 this 뒤에 원하는 매개변수항목을 추가합니다.
즉, 본격적인 매개변수 사용은 2번째 항목부터 같습니다.

[매개변수? 추가된 확장메서드]


Case 2. int사용과 더불어서 이번엔 List<int>를 사용합니다.

단순히 int같은 데이터타입말고

class, List<>에도 사용가능합니다.


아래 List<int>로 만들어두고 단순히 List의 항목들을 보여주는 함수를 추가할 예정입니다. (DisplayMyIntList)


아직까진 확장전이므로 확장메서드가 보이지 않습니다.

[List<int> 확장메서드 추가전]


[List<int>로 확장메서드 추가]


[List<int>내용을 보여주는 확장메서드의 결과]



Case 3. 기존 Class를 확장해보기

이번엔 Class확장입니다.


기존에 존재하는 MyClass라는 클래스에 추가함수를 추가하는 내용입니다.

namespace Ex02

{

// 기존에 있는 함수로 가정

    public class MyClass

    {

        public int speed;

        public void AddSpeed(int s) { this.speed += s; }

        public void DisplaySpeed() { Console.WriteLine("Current Speed is {0}", this.speed); }

    }


//확장. 만들어둔 클래스에 속도감소가 필요하다.

    public static class MyClassExt

    {

// this 에다가 확장할 클래스 MyClass를 써넣고,

// 추가적으로 감소량 (int 값)을 매개변수로 추가하자.

        public static void MinusSpeed(this MyClass cls, int s)

        {

            cls.speed -= s;    

// 확장메서드는 자신이 확장하고자하는 타입의 멤버들에 직접 접근할 수 없다고 합니다.

        }

    }


    class Program

    {

        static void Main(string[] args)

        {

            MyClass mc = new MyClass();

            mc.AddSpeed(100);

            mc.DisplaySpeed();


            mc.MinusSpeed(50);

            mc.DisplaySpeed();

        }

    }

}


[Class에 메서드 확장을 한 결과]


정말 C#도 파면팔수록 어렵네요. 

게다가 .Net 버전업그레이드시 함수나 사용법이 수정, 추가되는 경우도 있으니 (물론 쉬워지는 경우도 간혹 있지만)


솔직히 많이 쓰일지는 모르지만

복습상 올립니다.