Lamda
Lamda는 익명 메소드이며 Delegate의 익명 메소드를 좀 더 간결하게 표현할 수 있는 문법이다. Delegate의 익명 함수의 사용 방식은 아래와 같다.
// Delegate 형식 선언 및 정의
delegate int DelegateExample(int a, int b);
// 사용할 함수
int Sum(int a, int b)
{
return a + b;
}
// 일반적인 사용방식
DelegateExample de1 = Sum;
// 익명 함수 선언 및 사용
DelegateExample de2 = delegate(int a, int b)
{
Console.WriteLine("a + b = " + (a + b) );
}
de2는 Sum을 사용하지 않고 직접 익명 함수를 적용했다. 이것을 아래와 같이 Lamda식으로 변경할 수 있다.
DelegateExample de3 = (a, b) => { Console.WriteLine("a + b = " + (a + b) ); }
delegate를 사용하여 익명함수를 표현하는 것 보다는 간결해보이지만 개인적인 취향으로 따지자면 간단하고 쓰기 편한 방식보다는 명시적인 방식을 선호하기 때문에 Lamda를 사용하기보단 delegate를 사용을 선호한다.
Func
Delegate 또는 Lamda를 사용해서 다수의 무명 메서드를 사용하기 위해서는 각각의 무명 메서드마다 "Delegate의 형식 선언"과 "Delegate 변수의 선언"을 따로따로 수행해줘야 한다. 이렇게 반복되는 번거로움을 Func와 Action 키워드를 통해 해소할 수 있다. 즉, Func와 Action은 미리 선언된 Delegate 변수로서 별도의 선언 없이도 사용이 가능하다.
Func는 반환 값이 있는 메서드를 참조하는 Delegate 변수이다. 이에 대한 형식은 다음과 같다.
Func< param type 1, param type 2, .... , return type > func |
< > 내에 하나만 정의 되어있다면 그것은 return type이다. 두 개 이상일때는 앞은 Parameter type이며 항상 마지막 것이 Return type이다.
static int CallFunc() {
return 100;
}
static void Main(string[] args) {
Func<int> aFunc; // return type : int
Func<int, float> aFunc2; // parameter : int, return type : float
Func<int, int, int> aFunc3; // parameter : int, int return type : int
aFunc = CallFunc;
aFunc2 = (int a) => { return (float)(a / 2.0f); };
aFunc3 = (a, b) => (a + b);
Console.WriteLine("aFunc: " + aFunc());
Console.WriteLine("aFunc2: " + aFunc2(10));
Console.WriteLine("aFunc3: " + aFunc3(100, 100));
}
Action
Action은 반환 값이 없는 메서드를 참조하는 Delegate 변수이다. 이에 대한 형식은 다음과 같다.
Action<param type 1, param type 2, param type 3, ... > action |
Func와는 달리 < > 내의 type들은 모두 Parameter type이다.
static void CallAction() {
Console.WriteLine("CallAction");
}
static void Main(string[] args) {
Action aFunc;
Action<int> aFunc2;
Action<float, int> aFunc3;
aFunc = CallAction;
aFunc2 = (num) => Console.WriteLine("num:" + num);
aFunc3 = (a, b) => {
float result = b / a;
Console.WriteLine("a: " + a + " b:" + b + " result: " + result);
};
aFunc();
aFunc2(100);
aFunc3(6.0f, 10);
}
'프로그래밍 이야기 > GameDev' 카테고리의 다른 글
[C#] File - BinaryFormatter (0) | 2020.12.08 |
---|---|
[C# 코딩연습] 임의의 성적표. 성적 추출 (0) | 2020.12.04 |
[C#] Delegate, Event (0) | 2020.11.26 |
C#코딩 연습 - Indexer (0) | 2020.11.21 |
C#코딩연습 - 클래스 연습 (0) | 2020.11.18 |