Delegate(대리자)

정영훈·2022년 12월 7일
0

C#프로그래밍

목록 보기
29/29

Delegate(대리자)

현대 프로그래밍 언어들은 메서드를 변수처럼 활용하는 기능이 있다. 메서드를 변수처럼 활용하게 된다는 것은 메서드 자체를 매개변수로 전달하거나 반환할 수 있다는 말이고, 연산자까지 활용할 수 있게 된다는 의미인데, 이러한 기능이 델리케이트(대리자)이다.

델리케이트 형식 지정

[접근 제한자] 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; });
    }
}
profile
경북소프트웨어고등학교 정보교사

0개의 댓글