반응형
대리자(delegate)란?
C#에서 delegate(대리자)는 메서드를 대신 호출해지는 기법으로 '대신 실행해주는 사람'이라는 사전적 정의와 유사하다.
delegate를 선언하기 위해서 delegate 키워드를 사용한다.
한정자 delegate 반환타입 대리자이름 (매개변수목록)
delegate는 메서드의 주소를 참조하고 있어서 메서드를 대신 호출할 수 있는데,
C/C++의 참조 포인터와 유사하지만, 데이터 타입을 안전하게 처리한다는 장점이 있다.
델리게이트를 사용하는 경우
1. 함수를 변수에 담고 싶을 때 델리게이트를 사용할 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
public class TestClass
{
delegate void MyDelegate(); //이 델리게이트에 밑의 함수를 담을 수
//있다.
public TestClass() //생성자
{
MyDelegate myDelegate;
myDelegate = FuncTest;
myDelegate(); // 밑에 정의한 함수가 호출 됨!
// myDelegate = FuncTest2; // 델리게이트와 함수의 매개변수가 다르기 때문에 불가능함.
}
public void FuncTest()
{
}
public void FuncTest2(int a, int b)
{
}
}
delegate와 함수의 매개변수, 반환타입이 같아야 함수를 델리케이트에 담아서 사용할 수 있다.
그렇다면 실제로 델리게이트를 사용해서 Add 함수를 담아보자.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
public class TestClass
{
delegate void MyDelegate(); //이 델리게이트에 밑의 함수를 담을 수 있다.
delegate int AddDelegate(int a, int b);
public TestClass() //생성자
{
AddDelegate addDelegate = Add;
addDelegate(1, 2);
}
public int Add(int a, int b)
{
return a + b;
}
}
}
코드예제2> 코드 유지 보수를 위해 델리게이트를 사용해야 하는 경우
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
public class TestClass
{ public void ShowMenu()
{
int age = GetAge_Korea();
if ("JAPAN")
age = GetAge_Japan();
else
age = GetAge_Korea();
if (age >= 20)
{
}
else
{
}
}
private int GetAge_Korea()
{
//DB에서 현재 고객의 생년월일 가져오기
//현재 날짜 - 생년월일 + 1
}
private int GetAge_Japan()
{
//DB에서 현재 고객의 생년월일 가져오기
//현재 날짜 - 생년월일
}
}
}
만약 일본 외 다른 국가들을 추가해야 할 경우 if, else 부분을 계속 늘려나가야 하는 문제가 생긴다.
따라서 이 경우 delegate를 활용해 나이 계산하는 부분을 함수 바깥으로 빼 주면 된다. 즉 ShowMenu() 부분의 파라미터로 받는 것을 말한다. 이 경우 함수를 변수에 넣을 필요가 생기기에 델리게이트가 필요하다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
//int GetAge_Korea();
delegate int MyDelegate();
public TestClass()
{
ShowMenu(GetAge_Korea); // 한국인일 경우 호출
ShowMenu(GetAge_Japan); // 일본인일 경우 호출
}
public class TestClass
{
void ShowMenu(MyDelegate GetAge)
{
int age = GetAge();
if (age >= 20)
{
}
else
{
}
}
private int GetAge_Korea()
{
//DB에서 현재 고객의 생년월일 가져오기
//현재 날짜 - 생년월일 + 1
}
private int GetAge_Japan()
{
//DB에서 현재 고객의 생년월일 가져오기
//현재 날짜 - 생년월일
}
}
}
이렇게 델리게이트를 사용하면 함수를 변수에 담아서 비교 연산자를 사용할 수 있다.
반응형
'유니티 C#' 카테고리의 다른 글
사용자 정의 이벤트 - 델리게이트 delegate, 이벤트 Event, UnityEvent (0) | 2023.07.24 |
---|---|
[유니티C#] 유용한 Mathf() 함수들 (0) | 2023.01.02 |