https://novlog.tistory.com/47

1. 콜백이란?

프로그래머는 함수를 호출할 때 콜(Call)을 하여 호출한다. 예를 들어, Run() 이라는 함수를 사용하기 위해 콜(Call)을 하여, 함수를 실행해 달라고 요청을 하는 것이다.

콜백(CallBack)은, 콜의 반대되는 개념이다. 사장과 비서의 관계와 같다고 할 수 있는데, 비서(Delegate)에게 사장(Function)이 돌아온다면, 내가(프로그래머)말한 요청사항을 대신 전해달라고 하는것이다. C#은 이러한 콜백함수를 구현하는 Delegate라는 문법을 제공한다.

처음 delegate 문법을 공부할 때는, 그냥 바로 사장(Function)에게 작업을 요청하면 되는데 왜 굳이 번거롭게 비서(Delegate)를 통해 작업을 전달하는지 이해가 가지 않을 수 있다.

하지만 델리게이트는 다양한 방면에서 사용되는 중요한 문법이다. 예시로 게임의 UI를 델리게이트를 이용해 구현한다고 한다. 특정 버튼을 클릭하기 전 까지는 함수를 수행하지 않다가, 버튼을 클릭했을 경우 원하는 화면이나 창이 뜨드록 구현하는것이다.

2-1. Delegate 선언

이제 본격적으로 Delegate의 사용방법에 대해 설명하도록 하겠다.

Delegate를 이용하면, 함수를 다른 함수로 전달할 수 있다. 델리게이트의 기본적인 사용방법은 다음과 같다.

[기본형] delegate 반환형 이름 (파라미터)

메서드의 정의와 비슷하게 생기지 않았는가?

이렇게 delegate를 함수와 비슷하게 선언하도록 한 것은, 본연의 의미(메서드를 전달하는 것)을 직관적으로 표현하기 위함이라고 할 수 있다.

Delegate의 기본형에서 중요한 것은, 반환형과 파라미터(입력) 이다. 반환형과 파라미터가 임의의 메서드와 일치한다면, 그 메서드는 해상하는 델리게이트에서 사용이 가능하다. 아래는 Delegate를 사용한 예시 코드이다.

using system;

namespace Delegate_Example
{
	class Program
	{
		delegate int MyDelegate();
		
		static void ButtonPressed(MyDelegate clickedFunction)
		{
			clickedFunction();
		}

		static int TestDelegate()
		{
			Console.WriteLine("Hello World");
			return 0;
		}

		static void Main(string [] args)
		{
			ButtonPressed(TestDelegate);
		}
	}
}
Hello World

반환형이 int형이고, 입력값이 void는 MyDelegate 델리게이트를 선언한다.

다음으로, ButtonPressed 라는, MyDelegate 델리게이트 객체를 파라미터로 받는 메서드를 선언한다.

Main() 함수 부에서 ButtonPressed 함수에 “Hello World”를 출력하는 TestDelegate ㅎ마수를 델리게이트 형식으로 전달한다.