본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티40_C#_25_Delegate 델리게이트

Delegate(델리게이트)

*delegate : (집단의) 대표(자)

 

델리게이트는 값을 저장하는 참조 타입의 일종이다.

델리게이트는 객체를 참조하지 않고 메서드를 참조한다.

델리게이트 타입의 변수를 만들어서 참조할 메서드를 저장한다.

그러므로 메서드를 전달하고 싶을 때 델리게이트를 사용하면 된다.

즉, 델리게이트는 메서드 전달 대표자라고 할 수 있다. 

 

델리게이트 선언

 

선언 방법은 다음과 같다.

 

delegate 반환타입 델리게이트명(매개변수);

 

반환타입과 매개변수는 델리게이트에 저장할 메서드의 반환타입, 매개변수와 일치해야 한다.

델리게이트 선언의 예는 다음과 같다.

 

어떻게 작동하는 지 예를 만들어서 확인해보자.

 

위 코드는 Sample( )메서드를 델리게이트에 넣어서 호출하는 예이다.

 

5번 줄에서 델리게이트를 선언한다.

Sample메서드가 반환타입이 없고(void), 매개변수가 없기 때문에 델리게이트도 같은 형태로 선언한다.

 

9번 줄에서 델리게이트 타입의 변수 test를 만들고 Sample 메서드를 넣어서 만든 델리게이트 인스턴스(객체)를 생성하여 test변수에 저장한다.

10번 줄에 주석으로 처리한 부분은 델리게이트 객체를 생성하는 간편 버전이다.

델리게이트 객체를 생성할 때 new 키워드 없이 간단하게 메서드 이름만 적어도 된다.

 

12번 줄에서 이렇게 만든 델리게이트 변수를 호출한다.

델리게이트는 메서드를 저장하고 있기 때문에 괄호( )를 붙이는 것이 당연한것 같다.

 

실행하면 참조하고 있는 Sample메서드를 호출하여 다음과 같은 결과를 볼 수 있다.

 

또 다른 예를 하나 더 만들어본다.

 

이번에는 Number메서드와 DoubleNumber메서드를 델리게이트 변수에 넣어서 호출해본다.

Number메서드는 매개변수를 전달 받아서 문자열 안에 그 값을 출력한다.

DoubleNumber메서드는 매개변수를 전달 받아서 그 값에 2를 곱한 값을 출력한다.

 

5번 줄에서 델리게이트 선언할 때 저장할 메서드의 반환타입과 매개변수 타입을 같게한다.

6번 줄처럼 메서드를 넣지 않고 델리게이트 타입의 변수만 먼저 선언할 수도 있다.

 

10번 줄에서 Number 메서드를 델리게이트 변수에 넣은 후 11번 줄에서 인수 5를 넣어서 호출한다.

13번 줄에서는 DoubleNumber 메서드를 넣은 후 14번 줄에서 호출한다.

 

실행하면 다음과 같은 결과를 얻는다.

 

 

Multicast(멀티캐스트)

cast라는 말은 '던지다, 보내다' 라는 뜻이다.

그래서 멀티캐스트는 메서드를 여러 개 넣을 수 있는 기능이다.

메서드를 추가할 때는 += 연산자를 사용하고, 제거할 때는 -= 연산자를 사용한다.

 

10번 줄에서 ChangeCharacter메서드를 저장한다.

11,12번 줄에서는 메서드 2개를 추가했다.

 

실행하면 다음과 같이 출력된다.

 

 

Callback(콜백)

callback은 '답신 전화' 또는 '다시 부르다'라는 뜻이다.

 

델리게이트와 콜백이 만나면 델리게이트에 날개를 다는 격이다.

멋진 기능을 구현할 수 있다.

 

콜백 기능을 간단하게 말하면 호출 당한 쪽에서 호출한 쪽의 메서드를 다시 호출하는 것이다.

즉, 주고 받는다.(give and take)

 

예를 들어본다.

 

위 코드 처럼 Husband(남편) 클래스와 Wife(아내) 클래스가 있다고 하자.

남편 클래스가 GiveGift(선물을 주다) 메서드로 아내에게 TakeGift(선물을 받다) 메서드를 보내면 아내 클래스는 GetGift(선물을 받다) 메서드로 받은 후 함께 온 TakeGift 메서드를 다시 호출하는 코드를 작성해본다.

 

먼저 델리게이트를 사용하지 않고 객체를 사용해서 구현해보자.

7,8번 줄에서 각각 객체를 생성하여 변수에 저장한다.

10번 줄에서 husband의 GiveGift메서드를 인수 wife로 호출한다.

 

 

18번 줄에서 GiveGift메서드는 wife의 GetGift메서드에 남편 자신의 객체 this를 인수로 보낸다.

30번 줄에서 husband를 인수로 받으면 '고마워'를 출력한 후 다시 husband의 TakeGift메서드를 호출한다.

21번 줄에서 호출 받은 TakeGift메서드는 '사랑해'를 출력할 것이다.

 

 

이번에는 델리게이트를 이용해서 구현해보자.

 

클래스 객체를 생성하고 GiveGift메서드를 호출하는 것은 같다.

 

14번 줄에서 전달할 TakeGift 메서드를 위한 델리게이트를 선언한다.

21번 줄에서 TakeGift메서드를 저장한 toWife(아내에게) 변수를 만든다.

22번 줄에서 아내의 GetGift메서드를 인수 toWife로 호출한다.

35번 줄에서 아내의 GetGift메서드는 델리게이트 타입의 toWife를 매개변수로 받으면

37번 줄에서 문자열 '고마워'를 출력한다.

39번 줄에서 받은 델리게이트 객체를 다시 호출(콜백)한다.

콜백을 받은 델리게이트는 참조하고 있는 TakeGift메서드를 호출한다.

그러면 '사랑해'를 출력할 것이다.

 

실행하면 이전과 같은 결과가 나온다.

위와 같이 델리게이트의 콜백 기능을 이용하면 호출 받은 쪽에서 호출한 쪽에 있는 메서드를 호출할 수 있는 장점이 있다. 내용이 길어져서 콜백 기능을 좀 더 업그레이드한 'Event(이벤트)'에 대해서는 다음 글에서 알아본다.

 

끝.

Wraven...