Unity C#

C# Delegate에 대한 정리

Ms_Tony 2018. 7. 30. 00:21

Delegate

  • 메소드에 대한 참조를 나타내는 방
  • 메소드 대신해서 호출하는 역할
    • 메소드의 대리인 역할을 해주는 변수
    • 메소드를 직접적으로 호출하는 방식이 아닌, 델리게이트를 호출함으로써 해당 메소드를 호출(실행)할 수 있는 방식.
    • 델리게이트를 '인스턴스화' 하면 호환되는 파라미터 타입/개수와 리턴 타입이 같은 모든 메소드를 참조할 수 있게 된다.
  • C++의 함수 포인터와 동일한 형태로 사용가능하지만, 안전하게 캡슐화하여 사용할 수 있다는 장점이 있다.
  • 콜백(CallBack) 메소드를 구현할 때 효율적이다.
    • CallBack Method란? 
      • A 메소드를 호출할 때 B 메소드를 넘겨줘서 A 메소드로 하여금 B 메소드를 호출하도록 하는 것. 이 때 A 메소드를 콜백 메소드라고 한다.
  • Delegate Chain : 하나의 델리게이트에 여러개의 메소드를 연결시키는 것.
    • 함수를 멀티캐스트(Multicast)할 때 사용하면 유용하다.

예제 코드

using UnityEngine;

using System.Collections;

public class DelegateTest : MonoBehavior
{
    // 델리게이트에 연결할 함수의 원형 정의
    delegate void CalNumDelegate(int num);


    // 델리게이트 변수 선언
    CalNumDelegate calNum;

    void Start()
    {
        // calNum 델리게이트 변수에 OnePlusNum 함수 연결
        calNum = OnePlusNum;
        // 함수 호출
        calNum(4);


        // calNum 델리게이트 변수에 PowerNum 함수 연결
        calNum = PowerNum;

        // 함수 호출
        calNum(5);
    }

    void OnPlusNum(int num)
    {
        int result = num + 1;
        Debug.Log(One Plus = “ +result);
    }

    void PowerNum(int num)
    {
        int result = num * num;
        Debug.Log(Power = “ +result);
    }
}



Event와 Delegate의 차이점

  • 델리게이트가 public이라면, 이벤트 변수는 private 같은 느낌이다.
  • 델리게이트 변수는 자신이 속한 클래스 외부에서도 호출이 가능하다.
  • 이벤트 변수는 외부에서 호출이 불가능하고, 변수가 속한 클래스 내부에서만 사용하도록 제한되어있다. 
  • 이벤트는 특정 조건(사건)이 발생했을 때 자동으로 메소드를 호출하는 용도로 사용된다.


Func & Action

  • 무명 델리게이트
  • 미리 선언된 델리게이트 변수로써, 별도의 선언없이 사용가능하다.


Func Delegate

  • Func은 반환값(Return Type)이 '있는' 메소드를 참조하는 델리게이트 변수

  • .NET Framework에는 매개변수가 없는 메소드부터 매개변수가 16개인 메소드까지 총 17가지의 Func 델리게이트가 준비되어있다.

  • Func Delegate를 사용할 때는 반드시 반환형을 지정해줘야 한다.


Action Delegate

  • Action은 반환값(Return Type)이 '없는'메소드를 참조하는 델리게이트 변수
  • Func Delegate와 그 쓰임새나 형식은 같으나, 반환값(Return Value)가 없다.


람다식 (Lamda)

  • 무명 메소드를 단순 계산식으로 표현한 것.
  • 메소드는 크게 매개변수와 내부 식, 반환 값으로 구성되어있는데, 이들만 가지고 메소드를 계산으로 표현한다.
  • **추후에 좀 더 자세하게 알아볼 필요성이 있음.

Ex) button.addListener(() => 메소드명);


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

Unity3d Canvas Object에 대해서  (0) 2018.08.04
Collections, Boxing, UnBoxing 정리  (0) 2018.07.28
Unity Quaternion에 대한 정리  (0) 2018.07.23
Photon Server에 대한 기본 정리  (0) 2018.07.18
Unity Collider Component 정리  (0) 2018.07.18