[C# 고급문법] #2 Delegate(델리게이트) & 콜백함수(CallBack)

반응형
반응형

[목차]

#1. 콜백이란?
#2.1
델리게이트(Delegate) 선언

#2.2 .Invoke()

#2.3 델리게이트 체인(Delegate Chain)

 

* 개인적인 공부 기록용으로 작성한 포스팅 이기에 잘못된 내용이 있을 수 있으며, 추가하거나 잘못된 내용이 있다면 지속적으로 수정해 나갈 예정입니다.


#1 콜백이란?

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

콜백(CallBack)은, 콜의 반대 되는 개념입니다. 사장과 비서의 관계와 같다고 할 수 있는데, 비서(Delegate)에게 사장(Function)이 돌아온다면, 내가(프로그래머) 말한 요청사항을 대신 전해달라고 하는 것 이지요. C#은 이러한 콜백함수를 구현하는 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 함수를 델리게이트 형식으로 전달합니다.

마지막으로, ButtonPressed 함수가 실행되면서, 전달한 TestDelegate함수를 같이 실행시킵니다.


#2.2 .Invoke()

ButtonPressed 함수 내부에서, 전달받은 함수 TestDelegate를 호출할 때 clickedFunction() 형태로 호출했습니다.

그런데, .Invoke() 함수를 이용해서, 다음과 같은 형태로 함수를 호출하는 것 또한 가능합니다.

using System;

namespace Delegate_Example
{
    class Program
    {
        delegate int MyDelegate();

        static void ButtonPressed(MyDelegate clickedFunction)
        {
            clickedFunction.Invoke();
        }

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

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

출력결과는 동일합니다.

입력할 파라미터가 존재하는 경우 Invoke() 메서드의 괄호 안에 입력값을 넣어 줍니다. 보통은 그냥 메서드 이름으로 호출 하기는 하는데 코드를 이해할 수는 있어야 하니 .Invoke() 방식을 사용하는 프로그래머도 존재하기에, 숙지해 두도록 합시다.


#2.3 델리게이트 체인(Delegate Chain)

Delegate.Combine() 메소드를 이용하면, 여러개의 메서드를 묶는 것이 가능합니다. 아래는 Delegate.Combine()을 이용해 plus, minus, divide 함수를 묶어서 출력한 예시입니다.

using System;

namespace Delegate_Example
{
    class Program
    {
        delegate void MyDelegate(int a, int b);

        static void plus(int a, int b)
        {
            Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
        }

        static void minus(int a, int b)
        {
            Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
        }

        static void divide(int a, int b)
        {
            Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
        }

        static void Main(string[] args)
        {
            MyDelegate d = (MyDelegate)Delegate.Combine(new MyDelegate(plus), new MyDelegate(minus), new MyDelegate(divide));
            d(10, 2);
        }
    }
}
[출력결과]
10 + 2 = 12
10 - 2 = 8
10 / 2 = 5
반응형

댓글

Designed by JB FACTORY