[C#] Delegate (델리게이트)

ssungho·2023년 7월 16일
0

💡 CSharp Study

목록 보기
4/7
post-thumbnail

📖 델리게이트 (대리자)


💡 delegate란?

메서드 자체를 인자로 넘겨주는 ‘형식’이다.

  • 즉 델리게이트를 통해 메서드를 매개 변수로 전달할 수 있다.

    함수가 아니라 '형식'이라는 것에 유의하자.


📌 delegate를 사용하는 이유

우리가 게임을 하는데 버튼을 누르면 플레이어가 공격을 한다고 생각해보자.

// 버튼을 눌렀다는 메서드
void ButtonPressed()
{
    // 버튼이 눌렸을 때 일어날 흠수 호출
	// ex) PlayerAttack();
}
  1. 우리가 버튼을 눌렀을 때 일어날 일들을 ButtonPressed 내부에 순차적으로 코딩한다면 UI에 관련된 로직과 게임 로직 사이에 간섭 및 복잡성이 발생하는 문제가 일어날 수 있다.

    그러므로 최대한 분리를 시켜서 관리해야 장기적인 차원에서 유리하다.

  2. 애당초 우리가 수정할 수 없는 메서드를 사용할 경우가 있다.

    ButtonPressed같이 유니티에 버튼을 클릭시 사용하는 이벤트 메서드가 있는데 이것은 유니티에서 제공되는 메서드이기 때문에 이 메서드 자체를 수정할 수 없다.

이러한 문제점들을 해결하기 위해서 어떻게 하면 좋을까?

메서드 자체를 파라미터로 넘겨주면 해결할 수 있을 것 같은데?

파라미터로 메서드 자체를 입력받게 된다면, ButtonPressed 안에 나열된 순차적으로 실행될 것들에 대한 정의가 필요하지 않게 될 것이다.

delegate를 사용하면 메서드 자체를 파라미터로 넘겨줄 수 있게 되는 것이다.


📌 선언 방법

[접근 한정자] delegate [반환 타입] [delegate 이름]([매개 변수]);

선언 방법을 코드로 확인해보면 어려울 수 있으므로 아래와 같은 함수가 있다고 가정해보자.

int Test(object obj)

  • 함수의 반환 타입은 int타입이고 함수 이름은 Test매개변수는 Object타입이다.

여기서 함수의 이름 부분을 델리게이트의 이름으로 변경하고 delegate라는 예약어만 추가해주면 된다.

delegate int TestDelegate(object obj)

이제 TestDelegate를 이용하여 object타입을 매개변수로 받고 반환 타입이 int인 메서드를 매개변수로 넘겨줄 수 있다.


📌 delegate 생성 및 사용

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();

    • OnClicked라는 델리게이트를 선언
  • static void ButtonPressed(OnClicked clickedFunction)

    • 델리게이트를 이용할 함수
  • static int TestDelegate1(); static int TestDelegate2();

    • 델리게이트에 등록할 함수
  • OnClicked clicked = new OnClicked(TestDelegate1);

    • 델리게이트 타입의 clicked를 생성과 동시에 TestDelegate1 등록
      • 델리게이트를 객체화 할때 new를 이용하여 생성할 수 있고 new 없이도 사용할 수 있다.
        • ex) Onclicked clicked = Test;
  • clicked += TestDelegate2;

    • clicked에 TestDelegate2를 추가로 등록
      • 델리게이트를 객체화하면 += 연산자를 이용하여 여러개를 등록하는 것이 가능하다.
      • 반대로 -= 연산자를 이용하여 제거 또한 가능하다.
  • ButtonPressed(TestDelegate1); ButtonPressed(cliked); clicked();

    • ButtonPressed를 실행시키고 인자로 TestDelegate1을 넘겨준다.
    • ButtonPressed를 실행시키고 인자로 clicked 델리게이트 객체를 넘겨준다.
      • clicked에 TestDelegate1, 2가 등록되어 있으므로 두 함수가 차례대로 실행된다.
    • clicked에 등록된 함수를 차례대로 실행시킨다.

📌 실행 결과

ButtonPressed(TestDelegate1)를 먼저 실행해보자.

ButtonPressed함수가 실행되며 다음엔 델리게이트로 전달받은 함수가 실행된다.

다음으로 파라미터로 델리게이트 객체를 전달받은 ButtonPressed(clicked)를 실행하면

델리게이트 객체인 clicked에 등록된 함수들이 실행된다.

마지막으로 clicked() 자체를 실행하면

바로 위 경우와 똑같이 clicked에 등록된 함수들이 실행된다.


📝 정리

1. 델리게이트(delegate)를 이용하면 메서드의 파라미터로 메서드를 전달할 수 있다.

2. 델리게이트는 메서드가 아닌 '형식(type)'이며 델리게이트 인스턴스(객체)를 생성하여 사용한다.

3. 델리게이트 인스턴스는 여러 함수를 등록할 수 있고 제거 또한 가능하다.


인프런 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문 강의를 듣고 공식 문서를 참고하여 정리한 글 입니다.

개인 공부를 정리한 글이기 때문에 틀린 부분이 있을 수 있습니다.

profile
클라이언트 개발자가 되는 그날까지 👊

0개의 댓글

관련 채용 정보