반응형
Lambda
일회용 함수를 만든느 데 사용하는 문법
1. Lambda를 사용하는 이유
함수의 용도에 따라 아래와 같이 하나하나 늘리는 것은 매우 비효율적인 방법이다.
static Item FindWeapon()
{
foreach (Item item in _items)
{
if (item.ItemType == ItemType.Weapon)
return item;
}
return null;
}
static Item FindRareItem()
{
foreach (Item item in _items)
{
if (item.Rarity == Rarity.Rare)
return item;
}
return null;
}
이를 효율적인 방법으로 바꾸기위해 delegate를 사용한다.
item을 인자로 받아서 Item이 유효한지 안유효한지 boolean으로 반환하는 함수
bool ItemSelector(Item item);
함수에 delegate를 붙여줌으로써 함수가 아니라 ItemSelector가 인자를 넘겨줄 수 있는 delegate 타입 된다.
delegate bool ItemSelector(Item item);
위에 Find함수를 늘리던 것을 한 함수로 처리할 수 있다.
static Item FindItem(ItemSelector selector)
{
foreach (Item item in _items)
{
if (selector(item))
return item;
}
return null;
}
그럼에도 불구하고
조건이 많아지게 되면 ItemSelector에 넣어줄 함수를 만들어주어야 하는 부담이 있다.
static bool IsWeapon(Item item)
{
return item.ItemType == ItemType.Weapon;
}
Item item = FindItem(IsWeapon);
3. 해결책
01 AnnoymousFunction (무명 함수/ 익명 함수)
Item item = FindItem(delegate(Item item) { return item.ItemType == ItemType.Weapon; });
4. Lambda
01 람다식
함수를 선언하지 않고 일회용으로 빠르게 사용되어진다.
(input-parameters) => expression
람다 식의 입력 매개 변수는 괄호로 묶는다.
매개 변수가 없다면 빈 괄호를 사용
Action line = () => Console.WriteLine();
매개 변수가 하나만 있는 경우
Func<T1, TResult>
Func<double, double> cube = x => x * x * x;
매개 변수가 두 개이상인 경우 쉼표로 구분
Func<T1,T2,TResult>
Func<int, int, bool> testForEquality = (x, y) => x == y;
Item item = FindItem((Item item) =>{ return item.ItemType == ItemType.Weapon; });
ItemSelector selector = ((Item item) => { return item.ItemType == ItemType.Weapon; });
Item item = FindItem(selector);
02 공용 delegate
원하는 인자의 갯수를 지정해서 만들 수 있다.
delegate Return MyFunc<T,Return>(T item);
delegate Return MyFunc<Return>();
delegate Return MyFunc<T1, T2, Return>(T1 t1, T2 t2);
delegate를 직접 선언하지 않아도 이미 만들어진 애들이 존재한다.
01 Func
반환 타입이 있는 경우
Func<Item,bool> selector =((Item item) => { return item.ItemType == ItemType.Weapon; });
02 Action
public delegate void Action<in T1,in T2>(T1 arg1, T2 arg2);
반환 타입이 없는 경우
본 게시글은 MMORPG Part1을 수강하고 정리한 글입니다.
반응형
'유니티 공부 > C# 문법' 카테고리의 다른 글
C# 문법 - Reflection, Attribute (0) | 2023.04.20 |
---|---|
C# 문법 - exception (0) | 2023.04.19 |
C# 문법 - Event (0) | 2023.04.18 |
C# 문법 - Delegate(대리자) (0) | 2023.04.16 |
C# 문법 - property(프로퍼티) (0) | 2023.04.16 |
댓글