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처럼 델리게이트를 매개변수로 받을 수도 있다.
'개발 > C#' 카테고리의 다른 글
C# 연산자 종류 (0) | 2020.11.19 |
---|---|
[C#]URI 문자열을 이스케이프된 표현으로 변환합니다. (0) | 2020.10.08 |
[C#]가우스의 등차수열합 공식 (0) | 2020.08.21 |
[C#]파일 존재 유무 확인하기 (0) | 2020.08.07 |
[C#]파일 이름 변경하기 (0) | 2020.08.07 |
댓글