이번 포스팅은 C#을 사용하면서 자주 사용하고 있는 대리자 delegate에 대해 정리했습니다.
프로그래밍을 하게 되면 이벤트 기반 프로그래밍이라는 단어를 들어 보았을 것입니다.
C#에서 지원하는 이벤트 기반 프로그래밍을 이해하려면 먼저 대리자를 알아야 하며 그다음 이벤트를 알아야 합니다.
간단한 예시들과 함께 대리자 delegate에 대해 알아보겠습니다.
| 1. Delegate 란?
- Delegate를 설명하기 앞서 간단한 예시를 볼게요.
예시) 나는 친구를 부르기 위해 친구 집에 전화를 걸었습니다. 그런데 전화를 받은 사람은 친구 집에 계신 부모님이었습니다. 나는 친구 부모님에게 "친구가 돌아오면 전화 좀 해주세요"라는 내용을 남겼고 전화를 끊었습니다. 친구는 친구 부모님의 내용을 전달받고 나에게 다시 전화를 걸어 전화를 했습니다.
- 이 이야기에서 내가 친구 부모님에게 요청 했던 것을 CallBack이라고 부르는데 프로그래밍에서도 동일하게 사용됩니다. 프로그램에서 CallBack은 컴파일 시점이 아닌 프로그램 실행 중에 결정됩니다.
- 예시를 봤으니 이제 delegate에 대해 설명 해보겠습니다. C#에서는 CallBack을 실행하는 것을 Deleate, 즉 대리자가 실행합니다. 앞서 친구 부모님이 내가 친구에게 전화를 걸었다는 내용을 전달해 준 것이 바로 delegate의 역할입니다.
- delegate는 메소드에 대한 참조입니다. delegate에 메소드의 주소를 할당하고 호출하면 대리자가 메소드를 호출합니다.
| 2. Delegate 선언
한정자 delegate 반환형식 대리자명(매개변수)
- 위 delegate의 선언 형식을 보시면 메소드의 선언 형식과 매우 비슷해 보이는 것을 볼 수 있습니다.
delegate int MyDelegate(int x, int y);
- 실제로 선언을 해보니 메소드의 선언 방식과 더더욱 비슷하게 보입니다. 여기서 하나 알아두셔야 하는 것이 delegate는 인스턴스가 아닌 Type, 즉 형식입니다. MyDelegate는 int 혹은 string 같은 형식이며 MyDelegate 인스턴스를 따로 만들어야 합니다. 이는 예시를 통해 확인해 보겠습니다.
예시) delegate 사용 예시
delegate int ExamDelegate(int a, int b, string c);
int Sum(int a, int b, string x)
{
if(x == 'plus')
{
return a + b;
}
else if (x == 'minus')
{
return a - b;
}
}
ExamDelegate CallBack;
CallBack = new ExamDelegate(Sum);
Console.WriteLine( CallBack(3, 4, 'plus') ); // 출력 = 7
CallBack = new ExamDelegate(Sum);
Console.WriteLine( CallBack(9, 5, 'minus') ); // 출력 = 4
- 예시를 보면 Sum 메소드를 delegate가 참조할 때 사용하는 것을 확인할 수 있으며 인스턴스를 만들 때 new 연산자를 사용하는 것을 볼 수 있습니다.
- CallBack은 반환 형식이 int이며 매개변수가 (int, int, string)인 EaxmDelegate 대리자의 인스턴스입니다. EaxmDelegate생성자로 호출 헤서 CallBack 객체를 만들었습니다. 그리고 CallBack 생성자의 인수로 Sum 메소드를 사용했으며 매개변수 string에 'plus', 'minus'를 활용하여 동작을 다르게 만들었습니다. 이때 메소드를 사용하듯이 CallBack을 사용하면 자신이 참조하고 있는 메소드의 주소에 있는 코드를 실행하고 결과를 반환합니다.
- 앞서 예시를 들었던 통화 과정을 예시 코드에 빗대어 다시 만들었습니다.
지금까지 설명했던 delegate를 이용하여 CallBack을 구현하는 과정을 요약해 보겠습니다.
1. delegate 선언
2. delegate 인스턴스 생성 -> 인스턴스를 생성할 때는 메소드를 인수로 넘김
3. delegate 호출
이렇게 delegate의 선언 방법과 간단한 생성 및 호출에 대해 알아보았습니다.
다음 포스팅은 delegate가 왜 필요한지 언제 사용하는지에 대한 내용을 정리하려고 합니다.
질문이 있으시면 댓글로 남겨주세요!
감사합니다 :)
'C#' 카테고리의 다른 글
[C#] Bitmap.LockBits 메서드 (0) | 2023.09.25 |
---|---|
[C#] unsafe / fixed 키워드 (0) | 2023.09.25 |
[C#] record(레코드) 정의와 사용 (0) | 2023.09.24 |
[C#] BackgroundWorker 클래스 정리 (0) | 2023.04.24 |
[C#] 파일 존재 유무 확인 하는 3가지 방법 (0) | 2023.04.17 |