반응형
델리게이트(대리자. 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);
}
}
}
델리게이트는 한 개에 여러 메서드를 결합하면 한 번의 호출로 여러개의 메서드를 실행 할 수 있습니다.
예제 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에 메서드를 결합하거나 뺄 수 있습니다.
MyCalc a, b, c;
a = Plus;
b = Minus;
c = a + b;
c(10, 20);
반응형
'C# > C#_기초강의' 카테고리의 다른 글
(C#) 람다식(Lambda expression), 화살표 연산자(=>) 기초 (0) | 2023.04.23 |
---|---|
(C#) List<T> 리스트 제네릭 클래스(Generic Class) (0) | 2023.04.23 |
(C#) 2차원 배열 GetLength(0), GetLength(1) (0) | 2023.04.23 |
(C#) 1차원 배열 선언과 초기화, 크기 변경 Array.Resize (0) | 2023.04.23 |
(C#) 다양한 날짜와 시간 출력 서식 (0) | 2023.04.23 |