๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ/C#

[C#] ๋Œ€๋ฆฌ์ž(delegate)์™€ ์ด๋ฒคํŠธ

by HanaV 2023. 9. 10.
728x90

deligate (๋Œ€๋ฆฌ์ž)

delegate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜์ฒ˜๋Ÿผ delegate์— ๋ฉ”์„œ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ delegate๋Š”

delegate int MathOperation(int a, int b);

 int ๋‘ ๊ฐœ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ , ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

int Add(int a, int b)
{
    return a + b;
}

int Subtract(int a, int b)
{
    return a - b;
}

Add์™€ Substract ๋ฉ”์„œ๋“œ๋Š” ๋‹ค๋ฅด์ง€๋งŒ, ๋‘˜ ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ intํ˜• 2๊ฐœ๋ฅผ ๋ฐ›๊ณ , intํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— delegate MathOperation์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

delegate๋Š” ์„ ์–ธํ•˜๊ณ  ์„ ์–ธํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฉ”์„œ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

MathOperation operation = Add;

๋งŒ์•ฝ ์œ„์˜ Add์™€ Substract ๋ฉ”์„œ๋“œ๊ฐ€ Calculate ์ด๋ผ๋Š” ํด๋ž˜์Šค์— ๋“ค์–ด๊ฐ€์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Calculate cal = new Calculate();
MathOperation a;

a = new MathOperation(cal.Add); // a์— Add ๋ฉ”์„œ๋“œ ํ• ๋‹น
a = new MathOperation(cal.Substract); // b์— Substract ๋ฉ”์„œ๋“œ ํ• ๋‹น

 

degelate์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์™œ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋Œ€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

๋Œ€๋ฆฌ์ž๋Š” ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์†Œ๋“œ ์ž์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€๋ฆฌ์ž๋Š” ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ, ๋น„๊ต ๋กœ์ง์„ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋Œ€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ต๋ช…ํ•จ์ˆ˜๋‚˜ ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ผ๋ฐ˜ํ™” ๋Œ€๋ฆฌ์ž

๋Œ€๋ฆฌ์ž๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ผ๋ฐ˜ํ™” ๋ฉ”์„œ๋“œ๋„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

delegate int Method<T>(T a, T b);

 

๋Œ€๋ฆฌ์ž ์ฒด์ธ

๋Œ€๋ฆฌ์ž๋Š” ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด์„ ๋•Œ๋Š” ๊ฐ„ํŽธํ•˜๊ฒŒ ์—ฐ์‚ฐ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

namespace DelegateChains
{
    delegate void Notify(string message);

    class Notifier
    {
        public Notify EventOccured;
    }

    class EventListener
    {
        private string name;
        public EventListener(string name)
        {
            this.name = name;
        }
        public void SomethingHappened(string message)
        {
            Console.WriteLine($"{name}.SomethingHappended : {message}");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Notifier notifier = new Notifier();
            EventListener listener1 = new EventListener("Listener1");
            EventListener listener2 = new EventListener("Listener2");
            EventListener listener3 = new EventListener("Listener3");

            // += ๋กœ ์ž‡๊ธฐ
            notifier.EventOccured += listener1.SomethingHappened;
            notifier.EventOccured += listener2.SomethingHappened;
            notifier.EventOccured += listener3.SomethingHappened;
            notifier.EventOccured("You've got mail.");
            Console.WriteLine();

            // -= ๋กœ ๋Š๊ธฐ
            notifier.EventOccured -= listener2.SomethingHappened;
            notifier.EventOccured("Download complete.");
            Console.WriteLine();

            // Delegate.Combine์œผ๋กœ ์ž‡๊ธฐ
            Notify notify1 = new Notify(listener1.SomethingHappened);
            Notify notify2 = new Notify(listener2.SomethingHappened);
            notifier.EventOccured = (Notify)Delegate.Combine(notify1, notify2);
            notifier.EventOccured("Fire!!");
            Console.WriteLine();

            // Delegate.Remove๋กœ ๋Š๊ธฐ
            notifier.EventOccured = (Notify)Delegate.Remove(notifier.EventOccured, notify1);
            notifier.EventOccured("ASAP!!");
            Console.WriteLine();
        }
    }
}

 

์ด๋ฒคํŠธ

์ด๋ฒคํŠธ๋Š” ๋Œ€๋ฆฌ์ž์™€ ์ „๋ฐ˜์ ์œผ๋กœ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ๋Œ€๋ฆฌ์ž๋ณด๋‹ค ์•ˆ์ „ํ•œ ๋ฒ„์ „์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

using System;

public class Button
{
    public event EventHandler Click;
    public void OnClick()
    {
        // Click ์ด๋ฒคํŠธ๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœ
        Click?.Invoke(this, EventArgs.Empty);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Button button = new Button();
        button.Click += Button_Click;
        button.OnClick();

        Console.ReadLine();
    }

    private static void Button_Click(object sender, EventArgs e)
    {
        Console.WriteLine("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    }
}
728x90

"); wcs_do();