C#/C#_기초강의

(C#) 델리게이트(Delegate) 기초

코딩ABC 2023. 4. 23. 07:04
반응형

델리게이트(대리자. delegate)는 메서드에 대한 참조를 나타내는 형식입니다.

  • "대리자". "대신 처리해 주는 것"의 의미입니다.
  •  델리게이트를 이용해서 다른 메서드를 호출할 수 있습니다.
  • 대리자의 인스턴스를 통해서 메서드를 호출할 수 있습니다.
  • 호출할 메서드의 반환형과 매개 변수의 개수와 자료형이 일치해야 합니다.
  • 클래스의 외부나 내부에 선언할 수 있습니다.
  • 한 번의 델리게이트 호출로 여러 메서드를 호출할 수 있습니다.
  • 이벤트 처리기, 스레드 처리 등 다양하게 활용될 수 있습니다.

 

다음은 delegate의 선언 예를 보인 것입니다.

public delegate int Calc(int a, int b);

 

델이게이트의 선언은 호출할 메서드의 반환값, 매개 변수를 일치시켜야 합니다.

public int Plus(int a, int b)
{
   return a + b;
}
Calc c = Plus;    // 델리게이트의 인스턴스 선언
c(10, 20);          // Plus 메서드 호출
 

 

 

Delegate를 이용해서 다른 메서드를 호출하는 간단한 예를 들어보겠습니다.

예제 1

1. 프로젝트를 생성합니다.

  • Windows Forms 앱(.NET Framework)

2. 폼에 리스트박스 1개, 버튼 1개를 추가합니다.

3. 버튼에 다음 코드를 작성합니다.

using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;

namespace Delegate_1
{
    public partial class Form1 : Form
    {
        delegate void MyCalc(int a, int b);

        public Form1()
        {
            InitializeComponent();
        }

        private void Plus(int a, int b)
        {
            listBox1.Items.Add(String.Format($"{a} + {b} = {a + b}"));
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MyCalc md = Plus;
            md(20, 10);
        }
    }
}

델리게이트(Delegate)로 메서드 호출하기

 

 

델리게이트는 한 개에 여러 메서드를 결합하면 한 번의 호출로 여러개의 메서드를 실행 할 수 있습니다.

 

예제 2

1. 위에서 작성한 프로젝트에 버튼 1개(button2)를 추가하고, 코드도 추가합니다.

2. 완성된 전체코드는 다음과 같습니다.

using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Delegate_1
{
    public partial class Form1 : Form
    {
        delegate void MyCalc(int a, int b);

        public Form1()
        {
            InitializeComponent();
        }

        private void Plus(int a, int b)
        {
            listBox1.Items.Add(String.Format($"{a} + {b} = {a + b}"));
        }
        private void Minus(int a, int b)
        {
            listBox1.Items.Add(String.Format($"{a} - {b} = {a - b}"));
        }
        private void Division(int a, int b)
        {
            listBox1.Items.Add(String.Format($"{a} * {b} = {a * b}"));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyCalc md = Plus;
            md(20, 10);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MyCalc md = Plus;
            md(20, 10);

            md = Minus;
            md(20, 10);

            md = (MyCalc)Delegate.Combine(
                   new MyCalc(Plus),
                   new MyCalc(Minus),
                   new MyCalc(Division));
            md(20, 10);
        }
    }
}

델리게이트(Delegate)로 여러 개의 메서드 호출하기

 

 

다음과 같은 방법으로 delegate에 메서드를 결합하거나 뺄 수 있습니다.

MyCalc a, b, c;
      a = Plus;
      b = Minus;
      c = a + b;
      c(10, 20);

델리게이트(delegate)에 메서드 결합 또는 제거

 

반응형