이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.

-----------------------------------------------------------------------------------

델리게이트(delegate)


델리게이트를 사용하면 스크립트에서 강력하고 복잡한 동작을 만들 수 있습니다.

델리게이트는 간단히 메서드를 담는 상자로 생각할 수 있으며, 변수처럼 전달하거나 사용할 수 있습니다.

변수와 마찬가지로 델리게이트에 값을 할당할 수 있으며, 이 값은 런타임에 변경할 수 있습니다.

하지만 변수는 데이터를, 델리게이트는 함수를 담는것이 중요한 차이점입니다.


-----------------------------------------------------------------------------------

델리게이트의 사용

24b0d121e09c28a8699fe8b115ef0469943df4bc

델리게이트를 사용하기 위해선 먼저 delegate 키워드를 사용하여 델리게이트를 생성해야합니다.

델리게이트 키워드 다음에는 델리게이트의 시그니처가 옵니다.

메서드와 마찬가지로 델리게이트에는 반환형, 이름, 매개변수 목록이 존재합니다

위 코드에서 MyDelegate는 반환형이 void 이고 매개변수로 하나의 정수를 받습니다.


델리게이트를 생성했다면 이제 변수를 선언해봅시다.

이 변수는 방금 생성한 델리게이트 타입을 갖습니다.


코드 하단에는 두 가지 메서드가 존재합니다. 이 메서드들은 void를 반환형으로, 하나의 정수를 매개변수로 받습니다.

그리고 이는 델리게이트와 같습니다


이제 델리게이트를 사용해보겠습니다




24b0d121e09c28a8699fe8b115ef046c62f52d47


Start()메서드에서 PrintNum() 메서드를 myDelField에 할당하는 것을 볼 수 있습니다.

그런다음 myDelField()변수를 호출합니다.

이때 50이라는 값을 매개변수로 전달합니다.

다시 myDelField에 PrintDoubleNum()을 할당하고 값을 전해준뒤 호출합니다.


실행결과는 다음과 같습니다.

24b0d121e09c28a8699fe8b115ef046c61f82d4c

우리는 동일한 델리게이트 변수를 사용해 두 가지 다른 메서드를 호출할 수 있다는 걸 알게되었습니다.

이는 게임에서 어떤 함수가 호출될지 동적으로 제어할 수 있는 많은 기능을 제공합니다.

-----------------------------------------------------------------------------------

멀티캐스트 (Multicast)


델리게이트는 또한 멀티캐스트 기능을 가집니다. 멀티캐스팅은 단일 델리게이트 변수가 동시에 여러 메서드를 나타낼 수 있도록 합니다.


24b0d121e09c28a8699fe8b115ef0468e2afeab8

위 코드에서 델리게이트는 void를 반환형으로, 매개변수가 없는 시그니처를 갖고있습니다.

이를 통해 myDelField라는 델리게이트 변수를 만들었습니다.

익숙한 +=연산자를 통해 FirstMethod()와 SecondMethod()를 할당해봅시다.

그리고 델리게이트 변수를 호출했을 때의 결과입니다.


24b0d121e09c28a8699fe8b115ef046c64f8214e


델리게이트 변수를 멀티캐스트함으로써 한 번의 호출로 두 가지 메서드를 호출할 수 있습니다.

이런 방식으로 여러 기능을 중첩할 수 있습니다.


델리게이트 변수에서 메서드를 제거하려면 메서드 이름과 함께 -=연산자를 사용합니다.

-----------------------------------------------------------------------------------

주의해야 할 한 가지는 델리게이트 변수에 아무것도 할당하지 않은 상태에서 메서드처럼 호출하려고 시도하는 것입니다.

이런 상황에선 오류가 발생하며, 우리는 그러한 오류를 피하고 싶습니다.


현재 할당된 메서드가 없는 델리게이트 변수는 null 값을 가집니다. 따라서 델리게이트를 사용하기 전에 항상 null인지 아닌지 확인하는 것이 좋습니다.


24b0d121e09c28a8699fe8b115ef046c62f82c4c

현재 myDelField는 아무 메서드도 할당받지 않은 상태입니다.

if else문을 통해 null인지 아닌지를 판단합니다.


24b0d121e09c28a8699fe8b115ef0468eaa8e3

myDelField가 null임에도 오류를 피했습니다.