Delegate
- 메소드 이름을 저장하는 DataType
- 메소드의 반환값, 인자의 개수 및 타입을 메소드의 인터페이스 혹은 시그니쳐 라고 한다.
int addInt(int Num1, int Num2)
위가 메소드의 인터페이스 혹은 시그니처가 된다.
메소드를 개발자가 만들면 상황에 따라 반환값과 인자의 개수, 인자의 타입이 다 다르다. 그러므로 한가지 모양의 델리게이트를 정의할 수 없기 때문에 개발자가 델리게이트 즉 메소드를 저장하는 자료형을 직접 만들어 줘야 한다. 그래서 c#은 델리게이트 키워드만 제공하고 개발자는 이 키워드를 이용하여 델리게이트 자료형을 직접 만들어 사용한다.
static int addInt(int Num1, int Num2)
위 메소드 이름을 저장할 수 있는 자료형을 생성하려면 일단 delegate라는 키워드를 먼저 코딩한다.
이후 메소드의 인터페이스 부분을 그대로 적는다
여기서 메소드의 이름인 addInt를 개발자 마음대로 바꾸어 준다. 이 바꾸어진 이름이 새로운 data type이 된다.
여기서는 Facto라고 바꾼다. 제일 끝에 세미콜론을 추가 함으로 인해 새로운 data type인 Facto type을 완성한다
static void Main(string[] args)
{
int sum = addInt(3, 4);
Console.WriteLine(sum);
Facto aFacto;
aFacto = addInt;
}
static int addInt(int Num1, int Num2)
{
return Num1 + Num2;
}
delegate int Facto(int Num1, int Num2);
aFacto = addInt;
위 코드의 시사하는 바는 aFacto와 addInt는 같은 자료형이라는 것이다.
즉 위 그림에서 int addInt(int Num1, int Num2)에서 모양(인터페이스/시그니처)만 추출한 것이 델리게이트 Facto이기 때문에 컴파일러는 aFacto와 addInt를 같은 자료형으로 해석하게 된다.
static int addInt(int Num1, int Num2)
{
return Num1 + Num2;
}
static int mulInt(int Temp1, int Temp2)
{
return Temp1 * Temp2;
}
static void Main(string[] args)
{
int sum = addInt(3, 4);
Console.WriteLine(sum);
Facto aFacto;
aFacto = addInt;
aFacto = mulInt;
aFacto = addInt;
sum = aFacto(3, 4);
Console.WriteLine(sum);
aFacto = mulInt;
sum = aFacto(3, 4);
Console.WriteLine(sum);
}