본문으로 바로가기

Delegate

category C# 2020. 9. 15. 18:12

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);
}

 

'C#' 카테고리의 다른 글

C# 수업#12  (0) 2020.06.04
C# 수업#11  (0) 2020.06.03
C# 수업#10  (0) 2020.06.02
C# 수업#9  (0) 2020.06.01
C# 수업#8  (0) 2020.05.29