무명 메소드가 필요할 때 이를 참조할 수 있는 델리게이트 변수가 있어야 한다.
그러기 위해 델리게이트 타입을 선언해야 하는데, 만약 각기 다른 타입의 무명 메소드를 여럿 만들 때는 어떻게 할것인가?
일일이 그 타입에 맞는 타입과 변수를 따로 선언해야 하며 이는 매우 비효율적이다.
따라서 c#에서는 Func과 Action 델리게이트를 제공한다.
Func과 Action은 미리 서언된 델리게이트 변수로써 별도의 선언없이 사용가능하다.
Func은 반환값이 있는 메소드를 참조하는 델리게이트 변수이고,
Action은 반환값이 없는 메소드를 참조하는 델리게이트 변수다.
-Func 델리게이트
.NET Framework에는 총 17가지의 Func 델리게이트가 준비되어 있다.
즉, 매개변수가 없는 메소드부터 매개변수가 16개인 메소드까지
총 17개의 메소드를 참조 가능하다는 말이다. (무명 메소드 뿐만 아니라 일반 메소드도 참조 가능)
이정도면 특별한 경우가 아니고서야 별도의 델리게이트를 만들어 쓸 필요가 없겠다.
Func 델리게이트 변수를 선언하는 방법은 다음과 같다.
class Program
{
static float temp(int a, int b, int c)
{
return (a + b + c) * 0.1f;
}
static void Main(string[] args)
{
//매개변수가 없고 반환형이 float
Func<float> func0 = () => 0.1f;
//매개변수가 하나고 반환형이 float
Func<int, float> func1 = (a) => a * 0.1f;
//매개변수가 둘이며 반환형이 float
Func<int, int, float> func2 = (a, b) => (a + b) * 0.1f;
//매개변수가 셋이고 반환형이 float
Func<int, int, int, float> func3;
//일반 매서드 참조
func3 = new Func<int, int, int, float>(temp);
Console.WriteLine("func0 반환값: {0}", func0());
Console.WriteLine("func1 반환값: {0}", func1(10));
Console.WriteLine("func2 반환값: {0}", func2(10, 10));
Console.WriteLine("func3 반환값: {0}", func3(10, 10, 10));
}
}
예제에서 보듯이 반환형이 있는 델리게이트 메소드기 때문에 항상 마지막에 반환타입을 넣어준다.
-Action 델리게이트
참조하는 메소드의 반환값이 없다는 것만 빼고 Func과 동일하다.
class Program
{
static void temp(string name)
{
Console.WriteLine("name : {0}", name);
}
static void Main(string[] args)
{
int sum = 0;
Action act0 = () => Console.WriteLine("name : 액트0");
Action<string> act1 = new Action<string>(temp);
Action<string, string> act2 = (name, age) =>
{
Console.Write("name : {0}", name);
Console.WriteLine(" age :{0}", age);
};
Action<int, int, int> act3 = (a, b, c) => sum = a + b + c;
act0();
act1("액트1");
act2("액트2", "22");
act3(100, 209, 3);
Console.WriteLine("sum: {0}", sum);
//이렇게 메서드를 만드는 것이랑 무슨 차이가 있는가 고민하다 무명 메소드를 만들면 성능상의 이점이 있다는 글 발견.
//void act2(string name, string age)
//{
// Console.Write("name : {0}", name);
// Console.WriteLine(" age :{0}", age);
//}
}
}
'게임 프로그래밍 > C#' 카테고리의 다른 글
| 구조체와 클래스 차이 (0) | 2021.11.12 |
|---|---|
| 델리게이트 (0) | 2021.11.12 |
| Delegate, Event (0) | 2021.11.12 |
| Interface (0) | 2021.11.12 |
| 일반화 컬렉션 (0) | 2021.11.12 |





최근댓글