오늘은 팀 과제를 발표했다.
생각보다 기능이 잘 구현됐다.
굉장히 기쁨!
아래에서 플레이를 확인하세요~
https://www.youtube.com/watch?v=ktlQCnRH0FA&t=31s
우선 델리게이트에 대해 알기 전 변수에 대해 생각해보자.
변수 x는 어떤 값이 들어 있던지 그에 맞춰서 동작한다.
같은 로직이 있더라도, 변수에 의해 매번 다른 값을 가져온다.
그렇다면 델리게이트에 대해 알아보자.
만약 게임을 시작해서 데이터를 불러오고, 플레이어와 몬스터를 불러오는 기능이 있다고 가정하면
InitStageData();
SpawnPlayer(); // 이 메서드에서 불러올것이다.
SpawnMonster();
그렇다면 던전에 플레이어가 있다면, 어디에 생성할까?
정답은 없다!
상황에 따라 여러가지 메서드를 실행할 수 있을 것이다.
즉! 변수와 동일하다 생각할 수 있음!
x가 SpawnPlayer(),
인자가 _ARoom(), _BRoom, _RandomPlaece()라고 생각할 수 있다.
이러한 개념을 함수에 적용할 수 있게 해주는게 바로 Delegate다!
delegate 반환형 델리게이트이름 (매개변수);
e.g
delegate void SpawnDelegateFunc(); // delegte + 반환값(void) + 이름 설정 + 매개변수(void니까 없음)
delegate void SpawnDelegateFunc(); // 1.델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
InitStageData();
SpawnPlayer();
SpawnMonster();
}
변수타입(델리게이트 이름) 변수명 / 방식이다.
delegate void SpawnDelegateFunc(); // 델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
SpawnDelegateFunc spawnAction // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
InitStageData();
SpawnPlayer();
SpawnMonster();
}
delegate void SpawnDelegateFunc(); // 델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
SpawnDelegateFunc spawnAction // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
InitStageData();
SpawnPlayer();
SpawnMonster();
}
// 3. 사용할 함수 만들기
void SpawnPlayer_ARoom() {...}
void SpawnPlayer_BRoom() {...}
void SpawnPlayer_BossRoom() {...}
void SpawnPlayer_RandomPlace() {...}
함수를 만들때, 반환형과 매개변수가 같아야한다.
-> 델리게이트 반환, 매개변수와 사용되는 반환형, 매개변수가 같아야한다.
delegate void SpawnDelegateFunc(); // 반환형 void, 매개변수 없음
void Start()
{
SpawnDelegateFunc spawnAction // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
InitStageData();
SpawnPlayer();
SpawnMonster();
}
// 사용할 함수 만들기
void SpawnPlayer_ARoom() {...}
int SpawnPlayer_BRoom() {...} // 사용 X, 반환형 다름
void SpawnPlayer_BossRoom(string bossName) {...} // 사용 X, 매개변수 다름
void SpawnPlayer_RandomPlace() {...}
delegate void SpawnDelegateFunc(); // 1.델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
SpawnDelegateFunc spawnAction; // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
spwanAction = SpawnPlayer_Aroom; // 4. 델리게이트 변수에 함수 저장 실행하는 것이 아니기 때문에 괄호는 붙지 않음.
InitStageData();
SpawnPlayer();
SpawnMonster();
}
// 3. 사용할 함수 만들기
void SpawnPlayer_ARoom() {...}
void SpawnPlayer_BRoom() {...}
void SpawnPlayer_BossRoom() {...}
void SpawnPlayer_RandomPlace() {...}
delegate void SpawnDelegateFunc(); // 1.델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
SpawnDelegateFunc spawnAction; // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
spwanAction = SpawnPlayer_Aroom; // 4. 델리게이트 변수에 함수 저장 실행하는 것이 아니기 때문에 괄호는 붙지 않음.
InitStageData();
SpawnAction(); // 5. 델리게이트 실행
SpawnMonster();
}
// 3. 사용할 함수 만들기
void SpawnPlayer_ARoom() {...} // 6. 이게 실행된다.
void SpawnPlayer_BRoom() {...}
void SpawnPlayer_BossRoom() {...}
void SpawnPlayer_RandomPlace() {...}
즉! 아래와 같이 사용할 수 있다.
delegate void SpawnDelegateFunc(); // 1.델리게이트 선언, 선언만 했지 만들어진게 아님.
void Start()
{
SpawnDelegateFunc spawnAction; // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
spwanAction = ???; // 여기에 3번에 필요한 함수를 저장함. () 빼야함!
InitStageData();
SpawnPlayer();
SpawnMonster();
}
// 3. 사용할 함수 만들기
void SpawnPlayer_ARoom() {...}
void SpawnPlayer_BRoom() {...}
void SpawnPlayer_BossRoom() {...}
void SpawnPlayer_RandomPlace() {...}
확장성, 재사용성, 디커플링 등등 !
만약 측정 불가능한 경우의 수가 존재한다면?
e.g )
팝업 -> 게임이 커질수록 팝업 버튼을 눌렀을 때 행동하는 기능이 많아진다 가정하자.
팝업의 기능마다 함수를 만들어둘 수 없다. (함수가 많아짐)
-> 팝업별로 클래스를 만드는것도 힘들어진다.
이럴때, 함수의 매개변수로 변수를 넘기듯이 델리게이트를 넘길 수 있다.
델리게이트에는 필요한 각종 함수들이 담겨있다.
class UIPopup
{
public delegate void PopupConfirmFunc(); // 델리게이트를 외부에서 쓸거면 접근 제한자 붙여주면 된다.
// 클래스 안에서만 처리할거면 Private 쓰면될듯
public void PopupConfrim(PopupConfirmFunc confirmAction){
confirmAction();
}
}
// ConfirmAction()에는 다양한 함수가 들어있음.
-> 팝업별로 클래스를 만들 필요도, 함수를 따로 만들어둘 필요도 없다.
UIPopup을 모두 동일하게 사용할 수 있다.
인자값으로 델리게이트만 넘기면 된다.
-> 위임이라고 하며, 객체지향의 중요한 개념 중 하나다.
스위치는 계속 분기를 만들어서 코드 수정하고 따져야하는데,
델리게이트는 그냥 필요한 동작만 만들고 델리게이트를 만들고 단순히 사용만 하면된다!!
즉, 동적으로 처리가능함!
후발대 특강 듣기
알고리즘 풀기
코루틴에 대해 공부하기!