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형의 함수를 입력 받아서 함수의 내용을 반환하라는 뜻으로 해석하면 된다.