🐧 들어가기 앞서

오늘은 팀 과제를 발표했다.

생각보다 기능이 잘 구현됐다.

굉장히 기쁨!

아래에서 플레이를 확인하세요~

https://www.youtube.com/watch?v=ktlQCnRH0FA&t=31s


🐧 오늘 배운 것

  1. Delegate

🐧 기억할 것 & 진행

👏 Delegate

우선 델리게이트에 대해 알기 전 변수에 대해 생각해보자.

변수 x는 어떤 값이 들어 있던지 그에 맞춰서 동작한다.

같은 로직이 있더라도, 변수에 의해 매번 다른 값을 가져온다.


개요

그렇다면 델리게이트에 대해 알아보자.

만약 게임을 시작해서 데이터를 불러오고, 플레이어와 몬스터를 불러오는 기능이 있다고 가정하면

InitStageData();
SpawnPlayer(); // 이 메서드에서 불러올것이다.
SpawnMonster();

그렇다면 던전에 플레이어가 있다면, 어디에 생성할까?

  1. SpawnPlayer_ARoom()
  2. SpawnPlayer_BRoom()
  3. SpawnPlayer_RandomPlace()

정답은 없다!

상황에 따라 여러가지 메서드를 실행할 수 있을 것이다.

즉! 변수와 동일하다 생각할 수 있음!

x가 SpawnPlayer(),
인자가 _ARoom(), _BRoom, _RandomPlaece()라고 생각할 수 있다.

이러한 개념을 함수에 적용할 수 있게 해주는게 바로 Delegate다!

기본 구조

  • 기본 구조
delegate 반환형 델리게이트이름 (매개변수);

e.g

delegate void SpawnDelegateFunc(); // delegte + 반환값(void) + 이름 설정 + 매개변수(void니까 없음)

사용 방법

  1. Delegate 선언
    아래의 경우 델리게이트를 선언했을 뿐, 사용하고 있지 않다.
delegate void SpawnDelegateFunc(); // 1.델리게이트 선언, 선언만 했지 만들어진게 아님.

void Start()
{
	InitStageData();
    SpawnPlayer();
    SpawnMonster();
}
  1. 변수 만들기
    변수의 타입은 델리게이트의 이름을 사용하면 된다.

    변수타입(델리게이트 이름) 변수명 / 방식이다.

delegate void SpawnDelegateFunc(); // 델리게이트 선언, 선언만 했지 만들어진게 아님.

void Start()
{
	SpawnDelegateFunc spawnAction // 2.변수 만들기, 변수의 타입은 델리게이트 이름 사용.
	InitStageData();
    SpawnPlayer();
    SpawnMonster();
}
  1. 사용할 함수 만들기
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() {...} 
  1. 준비된 함수 중 사용하고 싶은 함수를 델리게이트 변수에 할당한다.
    주의할점 : 델리게이트 변수에 함수를 저장하는 것이지 실행하는 것이 아니다! () 붙으면 안된다.
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() {...} 
  1. 델리게이션이 저장된 함수를 호출하면 실행된다.
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을 모두 동일하게 사용할 수 있다.
인자값으로 델리게이트만 넘기면 된다.

-> 위임이라고 하며, 객체지향의 중요한 개념 중 하나다.

스위치는 계속 분기를 만들어서 코드 수정하고 따져야하는데,

델리게이트는 그냥 필요한 동작만 만들고 델리게이트를 만들고 단순히 사용만 하면된다!!

즉, 동적으로 처리가능함!


🐧 내일 할 일

후발대 특강 듣기

알고리즘 풀기

코루틴에 대해 공부하기!

0개의 댓글