Unity Chapter 8-2. C# 프로그래밍 [고급] : 델리게이트
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 8. C# 프로그래밍 : 고급
🔔 델리게이트
- 이전 포스트에서 공부했던
유니티 이벤트
는 C#에서 제공하는delegate
와Event
기능을 쉽게 사용할 수 있게끔 유니티에서 제공하는 기능이었다.
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
를 사용하여 스페이스바를 누르면 계산기는 단지 계산을 대신 해줄 뿐 어떤 값을 계산할지는 미리 모르도록하려고 한다.- 어떤 값을 계산할지는 실시간으로 바뀌도록.
델리게이트 원리
delegate
에 함수를 등록하면 그 함수들의 포인터(주소)들이 등록된다.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);
- delegate float
- 델리게이트 정의
- Calculate
onCalculate
;
- Calculate
함수들 등록하기, 실행하기
- 함수 등록하기
- 함수의 포인터를 등록해주어야 하기 때문에 함수의 이름을
+
,-
연산으로 추가 및 삭제를 해준다.- 함수의 이름에
()
를 붙여버리면 실행의 의미이므로()
은 떼고 함수의 주소를 담고 있는 함수의 이름을 등록해준다. - 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
을 실행하면 Sum 과 Multiply 가 연쇄적으로 실행된다. onCalculate
이 Sum(1, 10) 👉 Multiply(1, 10)을 대행해주는 것.
- 결과적으로
- Debug.Log(“결과값: “ +
델리게이트의 리턴
Debug.Log("결과값: " + onCalculate(1, 10));
- 목록의 마지막에 있는 함수의 리턴 값을 리턴한다.
onCalculate(1, 10)
는 Multiply(1, 10)의 실행 결과인 10 을 리턴한다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기