Delegate - 델리게이트
delegate 반환형 이름(매개변수)
참조할 메소드와 동일한 매개변수와 반환형으로 델리게이트 타입을 선언해야 한다.
delegate void Calcdele(int x, int y); // 델리게이트 타입 선언 (이름은 Calcdele, 반환형은 void, 매개변수는 int형 변수 2개)
선언한 델리게이트 타입으로 델리게이트 변수 생성 후, 생성한 델리게이트 변수에 참조할 메서드를 참조시키면 된다.
TypeF delgateName = new TypeF(MethodName)
또는 간단하게 생략해도 된다.
TypeF delegateName = MethodeName
delegate void Calcdele(int x, int y); // 델리게이트 타입 선언
void Add(int x, int y){ // int형 변수 x, y를 받으면 더한 값을 출력하는 void형 메소드 Add 생성
Console.WriteLine(x + y);
}
void main(){
Calcdele del = new Calcdele(Add);
//또는
Calcdele del = Add; // Calcdele 타입 변수 del 선언 후 Add 메소드 연결(참조)
del(1,2); // del을 통해 Add 메소드 기능 사용
}
이러면 del을 통해 전달된 매개변수 1과 2가 del과 연결된 Add 메소드로 전달되고 그대로 Add 메소드의 기능이 실행된다.
위에서는 반환값이 void였지만, int면 어떻게 될까.
delegate Calcdele(int x, int y);
int Add(int x, int y){
return x+y;
}
void main(){
Calcdele del = Add;
int result = del(1,2); //del에 1과 2를 주고 나온 반환값은 int형 변수 result에 저장
Console.WriteLine(result); //result를 출력하면 정상적으로 3이 출력됨
}
대강 시각적인 작동순서는 다음과 같다.
del(1,2) -> Add(1,2) -> Add 내에서 3으로 변경 후 del에게 3반환 -> del이 받고 다시 3 반환 -> result에 저장
즉 메소드의 반환값은 델리게이트의 반환값으로 돌아온다.
(델리게이트와 다른 데이터형인 메소드를 참조하면 오류가 난다.)
델리게이트 한번에 한 메소드가 아닌 여러 개의 메소드를 참조할 수 있다.
delegate void CalcDel(int x, int y);
void plus(int x, int y)
{
Console.WriteLine(x + y);
}
void minus(int x, int y)
{
Console.WriteLine(x - y);
}
void multip(int x, int y)
{
Console.WriteLine(x * y);
}
void Main()
{
CalcDel del = plus; // 델리게이트형 변수 del를 선언 후 plus 메소드를 참조하였다.
del += minus; // +=를 사용해서 다른 메소드를 추가로 참조할 수 있다. 여기서는 minus 메소드를 추가로 참조하였다.
del += multip; // 추가로 메소드를 참조하였다.
del(20, 10); // 30, 10, 200이 차례로 출력된다.
//puls 메소드 실행 -> minus 메소드 실행 -> multip 메소드 실행
-= 를 통해 참조한 메소드를 없앨 수도 있다.
del -= plus;
del -= multip;
del(20, 10); // 10만 출력된다.
또는 다음과 같이 사용할 수도 있다.
Calcdel del1 = plus;
Calcdel del2 = minus;
Calcdel del3 = multip;
del1 += del2;
del1 += del3; //하나의 델리게이트가 여러 개의 델리게이트를 포함할 수 있다.
}
Q . 그래서 이걸 왜 사용하느냐? 그냥 메소드 직접 호출하면 되는거 아닌가?
A . 여러 이유가 있지만, 주로 델리게이트는 콜백 메소드로 구현할 때 진가가 나온다.
콜백 메소드 - Callback Method
(따로 정리할 내용이기에, 간단하게만 적어두겠다.)
1. 다른 함수의 인자로써의 이용되는 함수
2. 어떤 이벤트에 의해 호출되어지는 함수
아래 예시는 간단하게 사용자가 계산기 프로그램에서 누른 버튼에 따라 콜백이 작동하는 상황을 표현한 것이다.
delegate void CalcDel(int x, int y);
static void Callback(int x, int y, CalcDel dele){ // 콜백 메소드 선언 (델리게이트를 매개변수로 받는 것을 볼 수 있다.)
dele(x, y); // 받은 두 인자를 받은 델리게이트로 호출
}
void Plus(int x, int y)
{
Console.WriteLine(x + y);
}
void Minus(int x, int y)
{
Console.WriteLine(x - y);
}
void Multip(int x, int y)
{
Console.WriteLine(x * y);
}
void Divide(int x, int y)
{
Console.WriteLine(x / y);
}
void Main()
{
Calcdel plus = Plus;
Calcdel minus = Minus;
Calcdel multip = Multip;
Calcdel divide = Divide;
Callback(20, 10, plus);
Callback(20, 10, minus);
Callback(20, 10, multip);
Callback(20, 10, divide);
//차례대로 30, 10, 200, 2가 출력된다.
}
개인적인 공부를 위해 정리한 내용이며, 틀린 점이 있을 수 있습니다.
만일 틀린 내용이 있다면, 댓글로 알려주시면 감사하겠습니다.