반응형
델리게이트란?
대리자 라는 뜻으로 c++의 함수 포인터와 비슷한 개념을 가지고 있다.
포인터의 설명은 위와 같다고 보면된다. 솔직히 정말 잘 정리한듯,,,
함수 포인터는 함수식을 인스턴스의 포인터처럼 인식을 해서 변수에 값을 저장하거나 파라미터로 넘겨서 실행하는 대리자이다.
그리고 델리게이트는 자체적으로 리스트 기능이 있다.
+=, -=같은 대입연산자를 통해 추가 및 제거가 가능하다.
선언 방법은 다음과 같다
delegate 반환타입 델리게이트이름 (매개변수)
함수 선언 방법과 동일하게 선언을 한다.
델리게이트 사용방법은 아래와 같다.
델리게이트 샘플 코드
using System;
namespace MyApp // Note: actual namespace depends on the project name.
{
internal class Program
{
public delegate void Test(string msg); //델리게이트 선언
public void DelegateTestA(string msg)
{//참조 메서드 생성
Console.WriteLine("Call DelegateTestA, param is " + msg);
}
public void DelegateTestB(string msg)
{
Console.WriteLine("Call DelegateTestB, param is " + msg);
}
public Program()
{
Test test;
test = new Test(DelegateTestA);
test("A");
test = new Test(DelegateTestB);
test("B");
}
static void Main(string[] args)
{
new Program();
}
}
}
샘플코드를 보면 알 수 있듯이 델리게이트가 참조하는 메서드는 반환타입과 매개변수가 델리게이트와 일치해야 한다.
그런데, 여기서 하나의 의문점이 생긴다.
그냥 바로 DelegateTestA("A"); 이렇게 호출하면 되는데 왜 굳이 코드를 몇 줄 더 적어가면서 델리게이트를 사용할까?
델리게이트 사용 이유는 다음과 같다.
- A클래스를 구현하고 B클래스를 구현하는데, A클래스에서는 B클래스가 구현되기 전까지 B클래스의 함수를 알 수 있는 방법이 없으므로 매개변수로 함수 자체를 받아 사용할 수 있다.(콜백함수로 사용할 수 있다.)
B클래스의 This함수를 사용한다 라고 명시해놓는다면 병목현상이 생기지 않아 구현에 좋다. - A클래스에서 B클래스로의 직접적 접근을 할 필요도 없고, 함수 이름도 알 필요가 없다.(델리게이트에 등록이 되어 있기 때문.)
그렇다면 콜백함수로 사용할 수 있는 방법을 알아보자.
콜백함수로 사용할 수 있는 샘플코드
using System;
namespace MyApp // Note: actual namespace depends on the project name.
{
internal class Program
{
public delegate void Callback();
public void CallbackFunc()//콜백으로 등록할 메서드
{
Console.WriteLine("Call CallbackFunc");
}
public void DelegateTestCallback(Callback callback)
{
Console.WriteLine("Call DelegateTestCallback");
callback();//콜백 메서드 호출
}
public Program()
{
Callback callback = CallbackFunc; //콜백 메서드 등록
DelegateTestCallback(callback); //함수 실행
}
static void Main(string[] args)
{
new Program();
}
}
}
다음 델리게이트 포스트에는 Func 델리게이트 뿐만 아니라 Action델리게이트, Predicate 델리게이트를 포스팅해야겠다.
포스팅에 오류가 있거나 오타가 있다면 댓글로 알려주시기 바랍니다.
도움이 되셨다면 공감버튼을 눌러주세요.🥰
반응형
'개발일지 > Unity 3D&C#' 카테고리의 다른 글
[C#] 반복문 - foreach / for / while (0) | 2022.06.30 |
---|---|
[C#] 람다식, 람다 문(Lambda) (0) | 2022.06.24 |
[C#] 델리게이트(delegate) - Func, Action, Predicate (0) | 2022.06.24 |
[UNITY] 코루틴이란? (0) | 2022.06.07 |
[디자인 패턴]Singleton 패턴 (0) | 2022.06.07 |
댓글