본문 바로가기

Unity(C#)

Unity(C#) delegate

delegate는 대행자를 뜻으로 C#에서는 함수들을 대신 실행시켜주는 기능을 한다.


사용법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
delegate int myDelegate(int value);
 
public class GameManager : MonoBehaviour
{
    myDelegate tempGate_1;
    myDelegate tempGate_2;
    myDelegate tempGate_3;
    myDelegate tempGate_4;
 
    void Start()
    {
        tempGate_1 = new myDelegate(Value_A);
        tempGate_2 = new myDelegate(Value_B);
        tempGate_3 = new myDelegate(Value_C);
        tempGate_4 = new myDelegate(Value_F);
 
        Debug.Log("Value_A : " + tempGate_1(10));
        Debug.Log("Value_B : " + tempGate_2(10));
        Debug.Log("Value_C : " + tempGate_3(10));
        Debug.Log("Value_F : " + tempGate_4(10));
    }
 
    int Value_A(int value)
    {
        return value + 10;
    }
 
    int Value_B(int value)
    {
        return value - 10;
    }
 
    int Value_C(int value)
    {
        return value * 10;
    }
 
    int Value_F(int value)
    {
        return value / 10;
    }
}
cs

4개의 delegate를 만든다음에 각각의 delegate의 함수를 넣어서 사용하는 예제이다


사용법2

delegate체인이다. delegate의 +와-를이용하여 함수를 여러개 추가할수있다 그렇게하면 delegate를 한번실행하면

추가해준  모든함수가 넣어준 순서대로 실행하게된다.

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
delegate void myDelegate(int value);
 
public class GameManager : MonoBehaviour
{
    myDelegate tempGate;
 
    void Start()
    {
        tempGate = new myDelegate(Value_A);
        tempGate += Value_B;
        tempGate += Value_C;
        tempGate += Value_F;
 
        tempGate(10);
    }
 
 
    void Value_A(int value)
    {
        Debug.Log(value + 10);
    }
 
    void Value_B(int value)
    {
        Debug.Log(value - 10);
    }
 
    void Value_C(int value)
    {
        Debug.Log(value * 10);
    }
 
    void Value_F(int value)
    {
        Debug.Log(value / 10);
    }
}
cs

delegate와 C의 함수포인터는 서로 비슷하다.

하지만 delegate와 함수포인터는 몇가지 다르다.

첫번째는 클래스의 개념이 없는 C에서의 함수 포인터는 말 그대로 외부의 어떤 함수에 대한 주소값만을 갖는다.

반면 C#의 delegate는  클래스 객체의 인스턴스 메서드에 대한 레퍼런스를 갖기 위해 그 C# 객체의 주소와 메서드 주소를 함께 가지고 있다.

C# delegate는 델리게이트 Type을 정의하는 것으로 이 Type으로부터 델리게이트 객체를 생성할 때, 이 객체가 메서드 정보와 객체 정보를 가진다.
클래스를 사용하는 C++에는 Pointer to member function이 있는데, 이는 한 클래스의 멤버 함수에 대한 포인터로서 '객체'에 대한 컨텍스트를 가지고 있다는 점에서 C#의 delegate와 비슷하다. 단, C#의 delegate는 메서드 Prototype이 같다면 어느 클래스의 메서드도 쉽게 할당할 수 있는데 반해, C++의 Pointer to member는 함수 포인터 선언시 특정 클래스를 지정해주기 때문에 한 클래스에 대해서만 사용할 수 있다.

두번째는 C의 함수 포인터는 하나의 함수 포인터를 갖는데 반해, C# delegate는 하나 이상의 메서드 레퍼런스들을 가질 수 있어서 Multicast가 가능하다.

또한 C의 함수포인터는 Type Safety를 완전히 보장하지 않는 반면, C#의 delegate는 엄격하게 Type Safety를 보장한다.

'Unity(C#)' 카테고리의 다른 글

Unity(C#)무명형식,무명메소드  (0) 2020.04.22
Unity(C#) Event  (0) 2020.04.21
Inspector에 변수 재목정하기  (0) 2020.03.05
Unity(C#) namespace사용방법  (0) 2019.11.06
Player 이동하기  (0) 2019.11.05