Game Development, 게임개발/개발

델리게이트, Delegates [Unity]

게임이 더 좋아 2021. 4. 2. 07:56
반응형
728x170

 

 

델리게이트??

뭔가 했다.

 

아직도 뭔가 하는 것 같다.

알아보자

 


 

우선 정의해보자

Delagate는 도대체 뭐하는 앤가?

 

delegate 해석하면 "대신 ~해준다" 정도로 해석된다.

뭘 대신해준다는 것일까?

Container for similar functions (or methods)다.

 

다시말해서

 

메서드를 참조해준다. 

 

우리는 변수를 선언해서 값을 담을 수 있지만

메서드를 담을 수 있는 변수는 없다.

 

delegate는 메서드를 담아준다.

delegate void firstdelegate();

firstdelegate = hello();


public void hello()
{
	print("Hello!");
}

hello라는 메서드를 firstdelegate가 참조한다.

 

 


 

 

어떻게 사용하느냐?

 

1. delegate라는 키워드를 사용한다.

2. 참조할 메서드의 리턴 타입을 정한다.

3. 참조할 메서드의 파라미터를 넣는다.

 

예를 들어서

delegate void mydelegate(int a, int b);

 

이렇게 선언했으면

 return 값이 없으며 , 매개변수로는 정수형 2개를 갖는 메서드를 참조할 수 있다는 말이다.

 

쉽게 말하면 내가 참조하고 싶은 메서드 형태 그대로를 선언해야 한다.

int에는 정수 밖에 모르듯이

delegate은 내가 지정해준 메서드만 알고 싶어한다.

 


 

이해는 가.. 그래

근데 그냥 메서드쓰면 되는건데 굳이 담아서 써야하나????

 

바로 재사용성을 위해서다.

조건에 따라 참조해야하는 메서드가 다르면 delegate 쓰지 않고서는

if else 문으로 실행해야 한다.

 

만약 delegate으로 메서드를 argument로 받을 수 있다면

기존의 로직을 유지하면서도 메서드의 추가 삭제가 가능하게 된다.

 

뭐 솔직히 안 써보면 이해가 안가는게 맞다.

왠지 많이 쓸 것 같다. 편한 기능 같다.

 

다시 말하면

클래스 설계의 원칙 중 하나인

개방 폐쇄의 원칙(OCPOpen-Closed Principle) : 확장(상속)에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.

이걸 생각하면 delegate를 쓰는 이유가 조금은 이해될지도 모른다.

 

이정도만 이해해보자.

 

 

아래의 예시는

delegate가 참조하는 값을 += 로 추가시키거나 -=로 뺄 수 있는 것을 보여준다.

** 여러 개의 메서드를 참조할 수 있다는 말이다.

 

 

DelegateScript

 

using UnityEngine;
using System.Collections;


public class DelegateScript : MonoBehaviour 
{    
    delegate void MyDelegate(int num);
    MyDelegate myDelegate;


    void Start () 
    {
        myDelegate = PrintNum;
        myDelegate(50);

        myDelegate = DoubleNum;
        myDelegate(50);
    }

    void PrintNum(int num)
    {
        print ("Print Num: " + num);
    }

    void DoubleNum(int num)
    {
        print ("Double Num: " + num * 2);
    }
}

 

 

MulticastScript

 

using UnityEngine;
using System.Collections;

public class MulticastScript : MonoBehaviour 
{
    delegate void MultiDelegate();
    MultiDelegate myMultiDelegate;


    void Start () 
    {
        myMultiDelegate += PowerUp;
        myMultiDelegate += TurnRed;

        if(myMultiDelegate != null)
        {
            myMultiDelegate();
        }
    }

    void PowerUp()
    {
        print ("Orb is powering up!");
    }

    void TurnRed()
    {
        renderer.material.color = Color.red;
    }
}

 

 

 


참고링크

 

learn.unity.com/tutorial/delegates

728x90
반응형
그리드형