본문 바로가기
유니티 공부/C# 문법

C# 문법 - Lambda, Func, Action

by 코딩하는 돼징 2023. 4. 19.
반응형

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을 수강하고 정리한 글입니다.

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part1/dashboard

 

 

 

 

반응형

'유니티 공부 > 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

댓글