C#

람다식(Lambda)

코다람쥐 2022. 1. 26. 15:11

1. 무명함수(익명함수)

using System;
using System.Collections.Generic;

namespace CSharp
{
    enum ItemType
    {
        Weapon,
        Armor,
        Amulet,
        Ring
    }
    enum Rarity
    {
        Normal,
        Uncommon,
        Rare,
    }
    class Item
    {
        public ItemType ItemType;
        public Rarity Rarity;
    }
    class Program
    {
        static List<Item> _items = new List<Item>();
        delegate bool ItemSelector(Item item);
        static bool IsWeapon(Item item)
        {
            return item.ItemType == ItemType.Weapon;
        }
        static Item FindItem(ItemSelector selector)
        {
            foreach(Item item in _items)
            {
                if (selector(item))
                    return item;
            }
            return null;
        }

        static void Main(string[] args)
        {
            _items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Normal });
            _items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
            _items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });

            Item item = FindItem(IsWeapon);
        }
    }
}

위의 코드가 있다고 할 때 무언가 복잡해보이니 전부 분석할 필요는 없다.

        static bool IsWeapon(Item item)
        {
            return item.ItemType == ItemType.Weapon;
        }
            Item item = FindItem(IsWeapon); // 메인함수에 있는 코드

IsWeapon가 bool값을 출력한다는 사실과 메인함수에서 사용된다는 것만 봐보자.

여기서 IsWeapon은 1번만 사용하고 싶을 때 굳이 정의까지 해주는 것은 귀찮을 수도 있다.

그럴 때 무명함수를 사용하면 FindItem의 인자로 함수의 식을 넣어줄 수 있다.

 

무명함수 표현방법

Item item = FindItem(delegate (Item item) { return item.ItemType == ItemType.Weapon; });

delegate키워드를 이용하고 IsWeapon의 매개변수와 함수의 내용만 복사하여 인자로 받았다.

 

2. 람다식(Lambda)

프로그래머들은 delegate를 붙이는 것도 귀찮았는지 람다식을 만들었는데 아래와 같이 표현을 한다.

람다식 표현방법

Item item = FindItem( (Item item) => { return item.ItemType == ItemType.Weapon; });

Item item형의 함수를 입력 받아서 함수의 내용을 반환하라는 뜻으로 해석하면 된다.