목표
- Delegate 사용법에 대해 알아보자
지옥문을 이용하면 지옥으로 갈 수 있죠.
Delegate
- 델리게이트는 메서드에 대한 참조를 나타내는 형식이다.
- 매개 변수 목록 과 반환 형식을 지정할 수 있다.
- C++의 함수 포인터와 유사하지만, 함수 포인터와 달리 멤버 함수에 대해 완전히 개체 지향적이다.
- 따라서 인스턴스 및 메서드를 모두 캡슐화 한다.
- 일반적으로 함수의 callback을 구현할때 사용한다.
Delegate 연결하기
- Delegate 1개와 Method 1개를 연결해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DelegateCallback : MonoBehaviour
{
delegate void MyDelegate(int number, string userId);
private MyDelegate _myDelegate;
// Start is called before the first frame update
void Start()
{
// MemberFunc을 델리게이트를 설정한다.
_myDelegate = MemberFunc;
// Invoke 함수를 상ㅇ하여 호출할 수 있다.
_myDelegate.Invoke(0, "apple");
}
public void MemberFunc(int number, string userId)
{
Debug.Log(number + " : " + userId);
}
}
Delegate 체인
- Delegate 1개와 Method n개를 연결해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DelegateCallback : MonoBehaviour
{
delegate void MyDelegate(int number, string userId);
private MyDelegate _myDelegate;
// Start is called before the first frame update
void Start()
{
// MemberFunc을 델리게이트를 설정한다.
_myDelegate = MemberFunc;
// MemberFunc2를 델리게이트에 추가로 연결한다.
_myDelegate += MemberFunc2;
// Invoke 함수를 상ㅇ하여 호출할 수 있다.
_myDelegate.Invoke(0, "apple");
}
public void MemberFunc(int number, string userId)
{
Debug.Log(number + " : " + userId);
}
public void MemberFunc2(int number, string userId)
{
Debug.Log(number + " : " + userId);
}
}
무명 메서드(Anonymous Method) Delegate
- 명칭없이 함수만 존재하는 함수를 무명 메서드라 한다.
- 무명 메서드도 함수와 동일하므로, 델리게이트와 연결 가능하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DelegateCallback : MonoBehaviour
{
delegate void MyDelegate(int number, string userId);
private MyDelegate _myDelegate;
// Start is called before the first frame update
void Start()
{
// 무명 메서드와 델리게이트 연결
_myDelegate = delegate (int number, string userId)
{
Debug.Log(number + " : " + userId);
};
}
}
람다식(Lamda Expression) Delegate
- 람다식은 현재 가장 많이 사용되는 문법일 것이다.
- 람다 선언 연산자(=>)를 사용하여 본문에서 람다의 매개 변수 목록을 구별한다.
- 람다 식을 사용하면 무명 함수를 좀더 간결하게 표현할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DelegateCallback : MonoBehaviour
{
delegate void MyDelegate(int number, string userId);
private MyDelegate _myDelegate;
// Start is called before the first frame update
void Start()
{
// 람다식과 델리게이트 연결
// 타입은 보통 명시하지 않아도 무방하다.
_myDelegate = (int number, string userId)=>
{
Debug.Log(number + " : " + userId);
};
}
}
Delegate 활용 예시
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DelegateCallback : MonoBehaviour
{
delegate void MyDelegate(int number, string userId);
private Dictionary<int, MyDelegate> _callbacks = new Dictionary<int, MyDelegate>();
void AddCallback(int callbackId, MyDelegate method)
{
if(_callbacks.ContainsKey(callbackId))
{
_callbacks.Remove(callbackId);
}
_callbacks.Add(callbackId, method);
}
MyDelegate GetMyDelegate(int callbackId)
{
if(!_callbacks.ContainsKey(callbackId))
{
return null;
}
return _callbacks[callbackId];
}
// Start is called before the first frame update
void Start()
{
AddCallback(0, (number, userId) =>
{
Debug.Log(number + " : " + userId);
});
var method = GetMyDelegate(0);
if(method != null)
{
method.Invoke(0, "kim");
}
}
}
'프로그래밍 > Unity C#' 카테고리의 다른 글
[Unity] Tutorial 06 - Intermediate Scripting (Events) (0) | 2020.05.27 |
---|---|
[Unity] Tutorial 06 - Intermediate Scripting (Attributes) (0) | 2020.05.27 |
[Unity] Tutorial 06 - Intermediate Scripting (Quaternions) (0) | 2020.05.27 |
[Unity] Tutorial 06 - Intermediate Scripting (Coroutines) (0) | 2020.05.27 |
[Unity] Tutorial 06 - Intermediate Scripting (Collections) (0) | 2020.05.27 |