메서드 자체를 인자로 넘겨주는 ‘형식’이다.
함수가 아니라 '형식'이라는 것에 유의하자.
우리가 게임을 하는데 버튼을 누르면 플레이어가 공격을 한다고 생각해보자.
// 버튼을 눌렀다는 메서드
void ButtonPressed()
{
// 버튼이 눌렸을 때 일어날 흠수 호출
// ex) PlayerAttack();
}
우리가 버튼을 눌렀을 때 일어날 일들을 ButtonPressed
내부에 순차적으로 코딩한다면 UI에 관련된 로직과 게임 로직 사이에 간섭 및 복잡성이 발생하는 문제가 일어날 수 있다.
그러므로 최대한 분리를 시켜서 관리해야 장기적인 차원에서 유리하다.
애당초 우리가 수정할 수 없는 메서드를 사용할 경우가 있다.
ButtonPressed
같이 유니티에 버튼을 클릭시 사용하는 이벤트 메서드가 있는데 이것은 유니티에서 제공되는 메서드이기 때문에 이 메서드 자체를 수정할 수 없다.
이러한 문제점들을 해결하기 위해서 어떻게 하면 좋을까?
메서드 자체를 파라미터로 넘겨주면 해결할 수 있을 것 같은데?
파라미터로 메서드 자체를 입력받게 된다면, ButtonPressed
안에 나열된 순차적으로 실행될 것들에 대한 정의가 필요하지 않게 될 것이다.
delegate
를 사용하면 메서드 자체를 파라미터로 넘겨줄 수 있게 되는 것이다.
[접근 한정자] delegate [반환 타입] [delegate 이름]([매개 변수]);
선언 방법을 코드로 확인해보면 어려울 수 있으므로 아래와 같은 함수가 있다고 가정해보자.
int Test(object obj)
int
타입이고 함수 이름은 Test
매개변수는 Object
타입이다.여기서 함수의 이름 부분을 델리게이트의 이름으로 변경하고 delegate
라는 예약어만 추가해주면 된다.
delegate int TestDelegate(object obj)
이제
TestDelegate
를 이용하여object
타입을 매개변수로 받고 반환 타입이int
인 메서드를 매개변수로 넘겨줄 수 있다.
class Program
{
// delegate OnClicked 선언
delegate int OnClicked();
// ButtonPressed 함수
static void ButtonPressed(OnClicked clickedFunction)
{
Console.WriteLine("버튼이 눌렸습니다..!");
// 델리게이트에 등록된 함수 호출
clickedFunction();
}
// delegate를 test할 함수
static int TestDelegate1()
{
Console.WriteLine("Delegate1 실행..!");
return 0;
}
static int TestDelegate2()
{
Console.WriteLine("Delegate2 실행..!");
return 0;
}
static void Main(string[] args)
{
// 객체 사용 방식
OnClicked clicked = new OnClicked(TestDelegate1);
clicked += TestDelegate2; // 객체로 선언하면 델리게이트를 체이닝 할 수 있다.
// 델리게이트 사용 1
ButtonPressed(TestDelegate1);
// 델리게이트 사용 2
ButtonPressed(clicked);
// 델리게이트 사용 3
clicked();
}
}
🔍 코드 분석
delegate int OnClicked();
static void ButtonPressed(OnClicked clickedFunction)
static int TestDelegate1();
static int TestDelegate2();
OnClicked clicked = new OnClicked(TestDelegate1);
ex) Onclicked clicked = Test;
clicked += TestDelegate2;
ButtonPressed(TestDelegate1);
ButtonPressed(cliked);
clicked();
ButtonPressed(TestDelegate1)를 먼저 실행해보자.
ButtonPressed함수가 실행되며 다음엔 델리게이트로 전달받은 함수가 실행된다.
다음으로 파라미터로 델리게이트 객체를 전달받은 ButtonPressed(clicked)를 실행하면
델리게이트 객체인 clicked에 등록된 함수들이 실행된다.
마지막으로 clicked() 자체를 실행하면
바로 위 경우와 똑같이 clicked에 등록된 함수들이 실행된다.
1. 델리게이트(delegate)를 이용하면 메서드의 파라미터로 메서드를 전달할 수 있다.
2. 델리게이트는 메서드가 아닌 '형식(type)'이며 델리게이트 인스턴스(객체)를 생성하여 사용한다.
3. 델리게이트 인스턴스는 여러 함수를 등록할 수 있고 제거 또한 가능하다.
인프런 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 강의를 듣고 공식 문서를 참고하여 정리한 글 입니다.
개인 공부를 정리한 글이기 때문에 틀린 부분이 있을 수 있습니다.