.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 키워드를 한정자로 써야한다 (그리고 첫번째만)
이 항목과 관련있는것같은데요.
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에 메서드 확장을 한 결과]
게다가 .Net 버전업그레이드시 함수나 사용법이 수정, 추가되는 경우도 있으니 (물론 쉬워지는 경우도 간혹 있지만)
솔직히 많이 쓰일지는 모르지만
복습상 올립니다.
'프로그래밍&IT > C#' 카테고리의 다른 글
[.Net C#] 올림, 내림, 반올림 (Ceiling, Truncate, Round) (0) | 2016.01.20 |
---|---|
[.Net C#] Datagridview에서 문자열 -> 숫자열 정렬하기 (8) | 2016.01.07 |
C# nullable타입 변수, 데이터 타입? 형식 & ?? 연산자 (0) | 2015.12.18 |
C# 암시적 타입변환 변수, var 타입 (0) | 2015.12.18 |
System.Environment 클래스관련해서 (0) | 2015.12.17 |