C Sharp Rookiss Part1 기초 프로그래밍 입문 : Lambda (람다식)
🙇♀️Lambda
- Lambda : 일회용 함수를 만드는데 사용하는 함수
🪐Delegate없이 무기찾기
enum ItemType
{
Weapon,
Armor,
Amulet,
Ring,
}
enum Rarity
{
Nomal,
Uncommon,
Rare,
}
class Item
{
public ItemType ItemType;
public Rarity Rarity;
}
enum 타입을 가진 ItemType과 Rarity를 가진 class Item
class Program
{
static List<Item> _items = new List<Item>();
static Item FindWeapon()
{
foreach (Item item in _items)
{
if (item.ItemType == ItemType.Weapon)
return item;
}
return null;
}
static void Main(string[] args)
{
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
Item item = FindWeapon();
}
}
- 아이템 리스트
static List<Item> _items = new List<Item>();
- 아이템을 삽입
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
- 아이템 찾기
// 각 무기마다 찾는 함수를 만들어 주어야 함
static Item FindWeapon()
{
foreach (Item item in _items)
{
if (item.ItemType == ItemType.Weapon)
return item;
}
return null;
}
// 메인함수에서 사용
Item item = FindWeapon();
Ring을 찾으려면 Ring함수를 다시 만드어야 됨
🪐Delegate로 불편함 줄이기
class Program
{
static List<Item> _items = new List<Item>();
delegate bool ItemSeletor(Item item);
static bool IsWeapon(Item item)
{
return item.ItemType == ItemType.Weapon;
}
static Item FindItem(ItemSeletor seletor)
{
foreach (Item item in _items)
{
if (seletor(item))
return item;
}
return null;
}
static void Main(string[] args)
{
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
Item item = FindItem(IsWeapon);
}
}
- delegate 생성
delegate bool ItemSeletor(Item item);
bool값을 반환하는 ItemSeletor라는 이름의 delegate이고 입력은 Item을 받는다
- delegate 사용하기
static bool IsWeapon(Item item)
{
return item.ItemType == ItemType.Weapon;
}
static Item FindItem(ItemSeletor seletor)
{
foreach (Item item in _items)
{
if (seletor(item))
return item;
}
return null;
}
- delegate를 이용해서 foreach문을 간단하게 만듦
- 하지만 bool값을 반환하는 함수를 만들어줘야 됨 - 콜백할
🪐Lambda 식을 이용해서 일회용 함수 만들기
static bool IsWeapon(Item item)
{
return item.ItemType == ItemType.Weapon;
}
이렇게 만들어 줘야하는 함수를 없앨수 있다
Item item = FindItem(IsWeapon);
// Anonymous Funtion : 무명함수/익명함수
Item item2 = FindItem(delegate (Item item) { return item.ItemType == ItemType.Weapon; });
// Lambda : 일회용 함수를 만드는데 사용하는 함수
Item item3 = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });
- Lambda는 무조건 일회용이 아니다!
ItemSeletor seletor = new ItemSeletor((Item item) => { return item.ItemType == ItemType.Weapon; });
이렇게 seletor에 넣을 수 있다
Item item4 = FindItem(seletor);
- seletor로 사용 가능
🪐Action, Func
class Program
{
static List<Item> _items = new List<Item>();
delegate Return MyFunc<T, Return>(T item);
static Item FindItem(MyFunc<Item, bool> seletor)
{
foreach (Item item in _items)
{
if (seletor(item))
return item;
}
return null;
}
static void Main(string[] args)
{
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
MyFunc<Item, bool> seletor2 = new MyFunc<Item, bool>((Item item) => { return item.ItemType == ItemType.Weapon; });
MyFunc<Item, bool> seletor3 = (Item item) => { return item.ItemType == ItemType.Weapon; };
}
}
-
공용적으로 사용할 수 있는 delegate
- Action : 반환타입이 없음
-
Func : 반환타입이 있음
- Lambda와 Func를 사용해 최대한 줄인 코드
class Program
{
static List<Item> _items = new List<Item>();
static Item FindItem(Func<Item, bool> seletor)
{
foreach (Item item in _items)
{
if (seletor(item))
return item;
}
return null;
}
static void Main(string[] args)
{
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
Item item5 = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });
}
}
🪐전체코드
namespace CSharp
{
enum ItemType
{
Weapon,
Armor,
Amulet,
Ring,
}
enum Rarity
{
Nomal,
Uncommon,
Rare,
}
class Item
{
public ItemType ItemType;
public Rarity Rarity;
}
class Program
{
static List<Item> _items = new List<Item>();
static Item FindItem(Func<Item, bool> seletor)
{
foreach (Item item in _items)
{
if (seletor(item))
return item;
}
return null;
}
static void Main(string[] args)
{
_items.Add(new Item() { ItemType = ItemType.Weapon, Rarity = Rarity.Nomal });
_items.Add(new Item() { ItemType = ItemType.Armor, Rarity = Rarity.Uncommon });
_items.Add(new Item() { ItemType = ItemType.Ring, Rarity = Rarity.Rare });
Item item5 = FindItem((Item item) => { return item.ItemType == ItemType.Weapon; });
}
}
}