[C#] 델리게이트



유니티를 통해 C# 문법을 확인해보자.

우선, 델리게이트란? 대리자를 뜻한다.

즉, 여러개의 함수가 있을 때 함수들을 통합 실행시켜주는 역할을 한다. 예시를 보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Delegate : MonoBehaviour
{
    int power;
    int def;

    private void SetPower(int value)
    {
        power += value;
        print("power의 값이" + value + "만큼 증가했습니다. 총 power의 값 = " + power);
    }
    private void SetDef(int value)
    {
        def += value;
        print("def의 값이" + value + "만큼 증가했습니다. 총 def의 값 = " + def);
    }
    private void Awake()
    {
        SetPower(5);
        SetDef(5);
    }
}

위와 같이 Player의 능력치를 셋팅하는 함수가 있다고 치자. 물론 지금 위 코드에선 능력치가 2개뿐이고 한번만 실행하기에 문제가 되지 않지만 만약에 능력치의 종류가 늘어나고 레벨업을 할 때 마다 실행해줘야 한다면 똑같은 코드를 계속해서 넣어야 할 것이다. 이를위해 존재하는 것이 delegate(델리게이트)이다.

사용 예시를 보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Delegate : MonoBehaviour
{
    private delegate void DelegateFun(int value);
    DelegateFun chain;

    int power;
    int def;

    private void SetPower(int value)
    {
        power += value;
        print("power의 값이" + value + "만큼 증가했습니다. 총 power의 값 = " + power);
    }
    private void SetDef(int value)
    {
        def += value;
        print("def의 값이" + value + "만큼 증가했습니다. 총 def의 값 = " + def);
    }
    private void Awake()
    {
        chain += SetPower;
        chain += SetDef;

        chain(5);
    }
}

여기서 중요한 것은 delegate를 선언할 때 반환형과 매개변수의 데이터 타입을 내가 등록하고자 하는 메소드와 동일하게 작성해주어야 한다는 것이다. 그리고 delegate키워드로 선언한 DelegateFun은 클래스이기 때문에 chain이라는 이름으로 객체를 생성하고 += 연산자로 함수를 등록하여 필요할 때 chain으로 등록한 함수를 모두 호출 할 수 있게 된다. 그리고 += 연산자로 함수 등록이 가능 하듯 -= 연산자로 함수 등록 해제 또한 가능하다. 여기서 주의해야 할 점은 함수 등록 해제를 하다가 등록된 모든 함수를 해제 한 다음 대리자를 호출하면 에러가 발생하기 때문에 다음과 같이 예외처리를 하는것이 좋다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Delegate : MonoBehaviour
{
    private delegate void DelegateFun(int value);
    DelegateFun chain;

    int power;
    int def;

    private void SetPower(int value)
    {
        power += value;
        print("power의 값이" + value + "만큼 증가했습니다. 총 power의 값 = " + power);
    }
    private void SetDef(int value)
    {
        def += value;
        print("def의 값이" + value + "만큼 증가했습니다. 총 def의 값 = " + def);
    }
    private void Awake()
    {
        chain += SetPower;
        chain += SetDef;

        chain -= SetPower;
        chain -= SetDef;

        if(chain!=null)
            chain(5);
    }
}





© 2022. by KSC

Powered by sora