반응형
Delegate
- 메서드의 주소를 저장하고, 호출할 수 있음
- 내용을 가지지 않음
- 메서드를 캡슐화하기 때문에 안전하고, 객체지향적임
- 함수 포인터
- delegate와 delegate에 추가할 함수는 같은 리턴값을 가져야 함
[3가지 유형]
1) 매개변수가 없고, 리턴타입이 없는 유형
public delegate void TestDelegate();
2) 매개변수를 가지고, 리턴타입이 없는 유형
public delegate void TestDelegate(object obj1, object obj2);
3) 매개변수와 리턴타입이 모두 있는 유형
public delegate int TestDelegate(object obj1, object obj2);
[3가지 단계]
1) Declaration(선언)
2) Instantiation(인스턴스화)
3) Invocation(호출)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
public class TestDelegate
{
// Declaration 선언
// 매개변수와 리턴 값이 모두 없는 경우
public delegate void FirstDelegate();
public void fun1()
{
Console.WriteLine("I am Function 1");
}
public void fun2()
{
Console.WriteLine("I am Function 2");
}
public void fun3()
{
Console.WriteLine("I am Function 3");
}
}
class Program
{
static void Main(string[] args)
{
TestDelegate testdelegate = new TestDelegate();
// Instantiation 인스턴스화
TestDelegate.FirstDelegate fd1 = new TestDelegate.FirstDelegate(testdelegate.fun1);
TestDelegate.FirstDelegate fd2 = new TestDelegate.FirstDelegate(testdelegate.fun2);
TestDelegate.FirstDelegate fd3 = new TestDelegate.FirstDelegate(testdelegate.fun3);
// Invocation 호출
fd1();
fd2();
fd3();
Console.ReadKey();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateExample
{
class Program
{
// 선언 -> 매개변수와 리턴값이 모두 있는 경우
public delegate int calculator(int x, int y);
static int Addition(int a, int b)
{
return a + b;
}
static int Subtraction(int a, int b)
{
return a - b;
}
static void Main(string[] args)
{
// 인스턴스화
calculator c = new calculator(Program.Addition);
Console.WriteLine("Addition of 5 and 10 is : {0}", c(5, 10)); // 호출
// 인스턴스화
calculator d = new calculator(Program.Subtraction);
Console.WriteLine("Subtraction of 5 and 10 is : {0}", d(5, 10)); // 호출
Console.ReadKey();
}
}
}