루키스 님 - 델리게이터 부분 07:06
델리게이트의 정의
📌델리게이트 : 대리자 = 대리하는 것
- 변수가 똑같은 로직을 다른 값으로 사용하는 것 마냥, 하나의 동작에 여러 상황이 부여되는 것.
- 함수 자체를 인자(연락처)로 넘겨주고 함수를 호출하는 것(거꾸로 연락 주는 것).
→ 걍 함수 담는 변수. 혹은 유사 함수 포인터. → 어려운 말로 함수에 대한 참조 타입이라 한다.
델리게이트 선언
delegate 반환형 델리게이트이름(매개변수)
- ex) delegate void SpawnDelegateFuc();
델리게이트 사용
delegate void SpawnDelegateFuc();
void Start()
{
//델리게이트를 저장할 변수 생성
SpawnDelegateFuc spawnAction;
//델리게이트 변수에 함수 저장, 이때 SpawnPlayer_A는 저장만 하지 실행하는게 아니므로 괄호를 붙이지 아니한다.
spawnAction = SpawnPlayer_A;
InitStageData();
SpawnPlayer();
SpawnMonster();
}
void SpawnPlayer_ARoom() {~~}
void SpawnPlayer_BRoom() {~~}
int SpawnPlayer_CRoom() {~~~} //반환형 차이 - 사용불가
void SpawnPlayer_BossRoom() {~~~} //매개변수 차이- 사용불가
- 델리게이트에 사용할 함수는 반환형과 매개변수 타입이 일치해야한다.
🌊사용 흐름
SpawnPlayer() : 플레이어를 스폰하는 함수
이때 고려할 수 있는 부분은
- 어떤 플레이어를 생성하는가?
- 어디에 생성하는가?
- 몇 개 생성하는가? ....
이 모든 것을 각각 별도로 작성한다면
예를 들어) UI관련 부분과 게임 로직 관련한 부분이 얽히게 됨.
- 따라서 하나의 기능을 파트 별로 분리하고 싶을 때
- 더불어 특정 함수가 시스템 측면에서 혹은 프로젝트 진행 측면에서 수정이 불가할 때(Console.WriteLine()을 수정 할 수 없는 것 처럼…)
어디에 생성하는지에 대해 초점을 맞춰본다면,
ARoom,BRoom, BoosRoom, Center ..... 셀 수 없이 많은 함수가 생긴다.
어떻게 적용할 수 있을까?
- 그냥 가져다가 필요할 때 꺼내서 사용한다.
- if문이나 switch문 같은 조건문을 사용한다.
- 델리게이트 선언해서 할당하고 필요한 곳에서 사용.
Q. 1,2번의 간단한 선택지가 있는데도 굳이굳이 먼 길을 돌아가야하는 이유가 무엇일까?
A. 개발에서 번거로운 짓을 한다면 대체로
🧾사용 예시(위임)
위와 같은 팝업창을 예로 들어보자.
사용할 수 있는 경우의 수는 여러가지일 것이다.
- 캐릭터 변경
- 캐릭터 삭제
- 아이템 판매
- 아이템 강화
- 게임 종료 등등 동일한 상황에서 서라 다른 기능을 필요로 함.
🤔이 때에 적합한 해결법은 무엇이 있을까?🤔
- 팝업 기능마다 함수를 만들어준다.
- 불필요하게 반복되는 코드가 많아짐.
- 확장성이 나빠짐.
- 팝업별로 클래스를 따로 만든다.
- 마찬가지로 위와 같이 빡셀것임.
이럴때 사용하는 것이 delegate
필요한 기능을 별도 구현하지 않고 전달 받은 기능만 실행하도록 구현.
함수의 매개변수 넘기듯 델리게이트를 넘겨버리면 해결.
class UIPopup
{
public delegate void PopupConfirmFunc();
public void PopupConfirm(PopupConfirmFunc confirmAction)
{
confirmAction();
}
}
위와 같이 별도로 구현해두지 않고 전달받은 기능만 실행하도록 해 여러 상황에 대응하는것을 위임이라고 하며 객체 지향의 주요 개념 중 하나이다.
Reference
Uploaded by N2T