본문 바로가기
개발/C#

delegate란 무엇일까?

by MNMNMNMN 2020. 9. 22.
728x90

delegate란 무엇일까?

 

delegate의 사전적 의미로는

1. (집단의 의사를 대표하는) 대표(자)

2. (권한업무 등을) 위임하다

3. (대표를) 뽑다

라고 네이버 영어사전에 나오네요.

 

프로그래밍에서는 대리자로 사용됩니다. 즉 누군가를 대신해서 일을 해주는 역할입니다.

델리게이트는 메소드를 참조합니다. 메소드의 주소를 할당한후 델리게이트를 호출하면 델리게이트가 할당한 메소드를 호출하는 것이죠.

비교하자면 C++에 포인터랄까요.

delegate 반환값 이름 (매개 변수)   >

델리게이트의 문법입니다. 델리게이트는 메소드 문법과 똑같고 이름 앞에 delegate 키워드만 붙여주면 됩니다.

public delegate int CustomDelegate(int src);

예를 들면 이렇게 사용합니다.

메소드를 참조해야 하기 때문에 메소드 문법과 같게 됩니다. 

그리고 델리게이트는 int,string,float과 같은 형식이라서 변수처럼 사용할 수 있습니다.

반응형
public delegate int CustomDelegate(int a,int b);

public void Test()
{
	CustomDelegate TestCallback = sum;
    
	//result = 3 의 결과가 나온다.
	int result = TestCallback(1,2);    
}

public int sum(int a, int b)
{
	return a+b;
}

예를 들면 이렇게 사용할 수 있습니다. 

 

CustomDelegate를 선언하고,

Test메소드에서 TestCallback이란 이름으로 sum이란 메소드를 참조 받습니다.

그리고 result변수에 TestCallback(1,2)를 실행하면 참조된 sum 메소드를 실행하여 3이라는 반환값을 받습니다.

어려우신가요? 

간단하게 이야기 하자면 메소드 자체를 변수처럼 사용할 수 있게 해주는 장치라고 생각하시면 편할 것 같습니다.

 

int a = 1;

int b = a;

string s = "Hello";

string t = s;

CustomDelegate TestCallback = Method;

또 다른 사용 방법은 메소드의 매개변수로 델리게이트를 사용하는 것입니다.

public delegate void CustomDelegate(bool flag);

private bool isLogin = false;
public void Test()
{
	Login();	//로그인을 시도한다.
	Logout();	//로그아웃을 시도한다.
}


public void Login()
{
	//로그인이 되어있었다면 로그인이 실패할 것이고, 
	//로그인이 되어있지 않았다면 로그인이 성공할 것이다.
	//로그인 콜백을 받는 완료 메소드를 실행.
	Complate(!isLogin,LoginCallback);
}
public void Logout()
{
	//로그인이 되어있었다면 로그아웃에 성공할 것이고, 
	//로그인이 되어있지 않았다면 로그아웃에 실패할 것이다.
	//로그아웃 콜백을 받는 완료 메소드를 실행.
	Complate(isLogin,LogoutCallback);
}

public void Complate(bool isSuccess,CustomDelegate callback)
{
	callback(isSuccess);
}

public void LoginCallback(bool isSuccess)
{
	if(isSuccess)
		isLogin = true;
	Console.WriteLine(" LoginCallback : " + isSuccess);
}
public void LogoutCallback(bool isSuccess)
{
	if(isSuccess)
		isLogin = false;
	Console.WriteLine(" LogoutCallback : " + isSuccess);
}

여기서 Complate처럼 델리게이트를 매개변수로 받을 수도 있다. 

 

 

 

 

728x90
반응형

댓글