현대 프로그래밍 언어들은 메서드를 변수처럼 활용하는 기능이 있다. 메서드를 변수처럼 활용하게 된다는 것은 메서드 자체를 매개변수로 전달하거나 반환할 수 있다는 말이고, 연산자까지 활용할 수 있게 된다는 의미인데, 이러한 기능이 델리케이트(대리자)이다.
[접근 제한자] delegate [반환형] [델리게이트 이름]([매개변수])
델리게이트는 특정한 형식을 가진 메서드를 자료형으로 선언하는 방법으로 클래스처럼 형식으로 선언하고 사용할 수 있다.
delegate void GoCarA(); //클래스 외부에서 선언 가능
class DelegateTest
{
//델리게이트 선언
delegate void GoCarB();
static void Main(string[] args)
{
}
}
이렇게 선언한 델리게이트를 사용하여 인스턴스를 만들 수 있고 인스턴스를 메서드를 이용하여 초기화 할 수 있다.
delegate void GoCarA(); //클래스 외부에서 선언 가능
class DelegateTest
{
//델리게이트 선언
delegate void GoCarB();
static public void GoStraight()
{
Console.WriteLine("직진");
}
delegate int Human(int age);
static void Main(string[] args)
{
//델리게이트 인스턴스화
GoCarA myCar = new GoCarA(GoStraight);
GoCarB myCar2 = GoStraight;
myCar();
myCar2();
}
}
연산자 | 설명 |
---|---|
+ | 델리게이트를 더한다. |
- | 델리게이트를 뺀다. |
delegate void GoCarA(); //클래스 외부에서 선언 가능
class DelegateTest
{
//델리게이트 선언
delegate void GoCarB();
static public void GoStraight()
{
Console.WriteLine("직진");
}
static public void GoLeft()
{
Console.WriteLine("좌회전");
}
delegate int Human(int age);
static void Main(string[] args)
{
//델리게이트 인스턴스화
GoCarA myCar = new GoCarA(GoStraight);
GoCarB myCar2 = GoStraight;
myCar+=GoLeft;
myCar();
}
}
델리게이트를 사용하는 예제를 살펴보자
class Item
{
public int Power { get; set; }
public string Name { get; set; }
public Item(int power, string name)
{
Power = power;
Name = name;
}
}
class Program
{
static List<Item> items = new List<Item>()
{
new Item(100,"할배검"),
new Item(200,"경소검"),
new Item(300,"봉양검"),
};
delegate bool ItemFinder(Item item, string name);
static void FindItem(ItemFinder itemFind)
{
string name = Console.ReadLine();
foreach (Item item in items)
{
if (itemFind(item, name))
{
Console.WriteLine("찾았다");
}
}
}
static bool Find(Item item, string name)
{
return item.Name == name;
}
static void Main(string[] args)
{
FindItem(Find);
}
}
무명함수를 이용하여 간단히 메서드를 줄이는 방법
class Item
{
public int Power { get; set; }
public string Name { get; set; }
public Item(int power, string name)
{
Power = power;
Name = name;
}
}
class Program
{
static List<Item> items = new List<Item>()
{
new Item(100,"할배검"),
new Item(200,"경소검"),
new Item(300,"봉양검"),
};
delegate bool ItemFinder(Item item, string name);
static void FindItem(ItemFinder itemFind)
{
string name = Console.ReadLine();
foreach (Item item in items)
{
if (itemFind(item, name))
{
Console.WriteLine("찾았다");
}
}
}
static void Main(string[] args)
{
FindItem(delegate (Item item, string name) { return item.Name == name; });
}
}
람다를 이용하여 줄이는 방법
class Item
{
public int Power { get; set; }
public string Name { get; set; }
public Item(int power, string name)
{
Power = power;
Name = name;
}
}
class Program
{
static List<Item> items = new List<Item>()
{
new Item(100,"할배검"),
new Item(200,"경소검"),
new Item(300,"봉양검"),
};
delegate bool ItemFinder(Item item, string name);
static void FindItem(ItemFinder itemFind)
{
string name = Console.ReadLine();
foreach (Item item in items)
{
if (itemFind(item, name))
{
Console.WriteLine("찾았다");
}
}
}
static void Main(string[] args)
{
FindItem( (Item item, string name) => { return item.Name == name; });
}
}