포스트

Unity C# Delegate

델리게이트 Delegate

타입 안전성을 제공하는 함수 포인터

C와 C++과 같은 언어에서는 함수 포인터를 사용하여 함수를 변수처럼 취급.
하지만, 이러한 함수 포인터는 타입 안전성이 부족하다는 단점을 가짐.

C#에서 delegate는 타입 안전한 함수 포인터의 역할.

delegate를 사용하면 컴파일 시간에 함수의 시그니처가 확인되어, 런타임 오류의 가능성을 줄일 수 있음.

  1. 이벤트 드리븐 프로그래밍 지원
    delegate는 이벤트 기반 프로그래밍을 구현하는 데 필수. 이벤트는 delegate를 통해 구독자(subscriber)에게 알림을 보낼 수 있으며, 이를 통해 객체 간의 느슨한 결합(loose coupling)을 실현할 수 있음. 이는 특히 GUI 애플리케이션과 게임 개발에서 중요한 부분임.

  2. 콜백 함수 구현 용이
    비동기 프로그래밍이나 이벤트 핸들링과 같은 상황에서 콜백 함수를 쉽게 구현할 수 있게 해줌. delegate를 사용하면 메소드를 인자로 넘겨 다른 메소드가 끝난 후에 실행될 작업을 지정할 수 있음.

  3. Delegate Chain 지원
    C#의 delegate는 하나 이상의 메소드를 참조할 수 있는 기능을 제공. 이를 통해 여러 메소드를 동시에 호출할 수 있으며, 이는 이벤트 핸들링이나 콜백 메커니즘 구현에 매우 유용.

  4. 익명 메소드 및 람다 표현식과의 연동
    delegate는 익명 메소드나 람다 표현식과 연동되어 사용될 수 있음. 이를 통해 코드를 더 간결하고 읽기 쉽게 만들 수 있으며, 특정 상황에 맞는 동작을 빠르게 구현할 수 있음.

예제 코드1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class DelegateExample : Monobehavior
{
    class Player
    {
        private delegate void Buffdelegate(); // 타입 정의

        private Buffdelegate _buffdelegate;   // 객체 (변수) 선언

        public enum Buff
        {
            None,
            Buff1,
            Buff2,
        }

        private Buff _buff;
        public Buff _Buff
        {
            get { return _buff; }
            set 
            {
                if(_buff == value)
                    return;
                
                _buff = value;
                if(_buff == Buff.Buff1)
                    _buffdelegate = Buff1;
                if(_buff == Buff.Buff2)
                    _buffdelegate = Buff2;
                if(_buff == Buff.None)
                    _buffdelegate = NoneBuff;
            }
        }

        public void Attack()
        {
            _buffdelegate.Invoke();
            Debug.log("Attack");    // 적을 공격하는 코드
        }

        void Buff1() { Debug.log("Buff1"); }  // 버프식 계산 함수 1

        void Buff2() { Debug.log("Buff2"); }  // 버프식 계산 함수 2

        void NoneBuff() {}  // 버프 없을 때

    }

    void Start()
    {
        Player player = new Player();
        player._Buff = Player.Buff.Buff1;
        player.Attack();
    }

}

예제 코드2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class GameEvents
{
    // 이벤트에 대한 delegate 선언
    public delegate void ActionTriggered(string action);

    // 이벤트 발생 시 호출될 delegate 인스턴스
    public ActionTriggered onActionTriggered;

    // 플레이어의 특정 행동을 시뮬레이션하는 메소드
    public void PlayerAction(string action)
    {
        Console.WriteLine("Player did: " + action);

        // delegate를 통해 이벤트 알림
        if (onActionTriggered != null)
        {
            onActionTriggered(action);
        }
    }
}

public class Program
{
    public static void Main()
    {
        GameEvents gameEvents = new GameEvents();

        // 이벤트 리스너 추가
        gameEvents.onActionTriggered += ActionHandler;

        // 플레이어 행동 시뮬레이션
        gameEvents.PlayerAction("Jump");
        gameEvents.PlayerAction("Run");
    }

    // 이벤트 핸들러
    static void ActionHandler(string action)
    {
        switch (action)
        {
            case "Jump":
                Console.WriteLine("Player jumped!");
                break;
            case "Run":
                Console.WriteLine("Player is running!");
                break;
            default:
                Console.WriteLine("Unknown action performed.");
                break;
        }
    }
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.