Unity Chapter 8-2. C# 프로그래밍 [고급] : 델리게이트

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 8. C# 프로그래밍 : 고급


🔔 델리게이트

  • 이전 포스트에서 공부했던 유니티 이벤트C#에서 제공하는 delegateEvent기능을 쉽게 사용할 수 있게끔 유니티에서 제공하는 기능이었다.

delegate : 델리게이트 목록에 실행할 함수들을 등록을 해놓으면 이 델리게이트가 등록된 함수들을 연쇄적으로 대신 실행시켜준다.

  • 마치 유언 대리인 처럼
    • 유언 리스트 내용에는 관심이 없고 미리 알 수도 없지만
    • 일단 고객이 죽고나면 유언 리스트대로 대행해 준다.


델리게이트를 사용하지 않은 경우

📜Calculator.cs

계산 기능을 수행하는 스크립트. (빈 오브젝트에 붙여 실행해보자)

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

public class Caculator : MonoBehaviour
{

    public float Sum(float a, float b)
    {
        Debug.Log(a + b);
        return a + b;
    }

    public float Subtract(float a, float b)
    {
        Debug.Log(a - b);
        return a - b;
    }

    public float Mulitply(float a, float b)
    {
        Debug.Log(a * b);
        return a * b;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Sum(1, 10);
            Subtract(1, 10);
            Mulitply(1, 10);
        }
    }
}
  • 실행하는 순간에 어떤 계산을 할지를 미리 명시하여야 한다.
    • 계산기가 어떤 계산을 할지 미리 알고 있어야 한다.
      • 인자 값이 정해져있고 다른 값을 계산하고 싶을 때마다 함수의 인자를 직접 다 바꿔주고 연산 순서를 바꾸는 등 코드를 새로 짜야하는 불편이 따른다.


델리게이트를 사용한 경우

  • 계산기는 계산을 맡기면 계산을 대행해줄 뿐이어야 한다. 어떤 계산을 해야 할지를 미리 신경을 쓰면 안된다.
  • delegate를 사용하여 스페이스바를 누르면 계산기는 단지 계산을 대신 해줄 뿐 어떤 값을 계산할지는 미리 모르도록하려고 한다.
    • 어떤 값을 계산할지는 실시간으로 바뀌도록.

델리게이트 원리

image

  1. delegate에 함수를 등록하면 그 함수들의 포인터(주소)들이 등록된다.
  2. delegate가 실행될 땐 등록된 함수들을 전부 실행시켜주는데 이때 등록된 주소들을 참조하여 함수들을 차례로, 연쇄적으로 실행시킨다.


델리게이트를 사용하는 방법

선언 및 정의

자료형과 같이 찍어낼 수 있는 원본이 되며, 등록할 수 있는 함수의 조건을 제한한다.

delegate float Calculate(float a, float b);
Calculate onCalculate;
  • delegate float Calculate(float a, float b);
    • Calculate이라는 이름의 delegate 형을 선언한 것.
      • 그 자체로 변수나 오브젝트나 그런게 아니라
      • 찍어낼 수 있는 delegate의 원형을 선언 한 것.
    • 리턴 타입 float, 매개 변수 float 2개인 함수만 등록 가능하도록 제한한 상태.
  • Calculate onCalculate;
    • Calculate형인 델리게이트 onCalculate를 정의했다.
      • onCalculate에 대행할 함수들을 등록할 수 있다.
      • 리턴 타입 float, 매개 변수 float 2개인 함수만 등록 가능.
    • 위에서 선언한 Calculate 타입 으로 실존하게끔 찍어낸 델리게이트다.
📜Calculator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Caculator : MonoBehaviour
{
    delegate float Calculate(float a, float b);

    Calculate onCalculate;

    void Start()
    {
        onCalculate = Sum;
        onCalculate += Subtract;
        onCalculate -= Subreact;
        onCalculate += Multiply;
    }

    public float Sum(float a, float b)
    {
        Debug.Log(a + b);
        return a + b;
    }

    public float Subtract(float a, float b)
    {
        Debug.Log(a - b);
        return a - b;
    }

    public float Mulitply(float a, float b)
    {
        Debug.Log(a * b);
        return a * b;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("결과값: " + onCalculate(1, 10));
        }
    }
}
  • 델리게이트 형 선언
    • delegate float Calculate(float a, float b);
  • 델리게이트 정의
    • Calculate onCalculate;
함수들 등록하기, 실행하기
  • 함수 등록하기
    • 함수의 포인터를 등록해주어야 하기 때문에 함수의 이름+,- 연산으로 추가 및 삭제를 해준다.
      • 함수의 이름에 ()를 붙여버리면 실행의 의미이므로 ()은 떼고 함수의 주소를 담고 있는 함수의 이름을 등록해준다.
      • C++ 처럼 함수의 이름이 곧 함수의 주소값이다.
      void Start()
      {
          onCalculate = Sum;
          onCalculate += Subtract;
          onCalculate -= Subreact;
          onCalculate += Multiply;
      }
    
    • void Start()으로 게임이 시작되면 onCalculate 목록에 다음과 같이 함수들을 등록한다.
      • onCalculate 목록에 Sum 함수를 추가해준다.
      • onCalculate 목록에 Subtract 함수를 추가해준다.
      • onCalculate 목록에서 Subtract 함수를 빼준다.
      • onCalculate 목록에 Multiply 함수를 추가해준다.
      • 결과적으로 onCalculate 목록엔 Sum, Multiply 가 들어 간다.
  • 함수 실행하기
    • Debug.Log(“결과값: “ + onCalculate(1, 10));
      • onCalculate(1, 10)을 실행하고 결과를 리턴한다.
        • 결과적으로 onCalculate을 실행하면 SumMultiply 가 연쇄적으로 실행된다.
        • onCalculateSum(1, 10) 👉 Multiply(1, 10)대행해주는 것.
델리게이트의 리턴
Debug.Log("결과값: " + onCalculate(1, 10));
  • 목록의 마지막에 있는 함수의 리턴 값을 리턴한다.
    • onCalculate(1, 10)Multiply(1, 10)의 실행 결과인 10 을 리턴한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


댓글남기기