📁 개발 히스토리

유니티 - 제네릭(Generic Type), 델리게이트(Delegate)

일단몸통박치기 2023. 4. 16. 15:36

오늘은 내가 맨날 헷갈려하는 두 골칫덩이에 대해 설명한다...

사용법을 이해는 했는데 아직 내 코드에 넣으려고 하면 매번 까먹어서 정리해둬야 할 것 같다.

 

우선, 제네릭 타입(Generic Type). 제네릭은 클래스, 인터페이스, 함수 등에서 동일하게 작동하지만 매개변수의 타입만 다른 경우에 사용하는, 말하자면 공용 타입? 인 셈이다.

 

예를 들어 a와 b 두 숫자를 더하는 함수를 작성하는데 int 형식일수도, float 형식일수도 있다.

 

int SUM(int a. int b)
float SUM(float a, float b)

 

이런 경우 형식에 따라 매번 다른 함수를 만들어주는 것보다

 

T SUM(T a, T b)                                                             //이렇게 쓰는게...? 맞나?

 

암튼 이렇게 해두면 한 함수로 여러 타입 우려먹을 수 있다...

 

남이 만든 제네릭 타입을 평상시에도 왕창 쓰고 있는데 그 예시가 바로 다음이다

 

C#에서 사용하는 제네릭 타입 → List<t>

: 리스트 뒤에 어떤 데이터 형식을 붙여도 해당 형식의 리스트를 얻을 수 있고 모두 동일한 방식으로 작동함.

 

그...리고 class의 형식을 T로 둘 때

이 T부분을 무엇으로 할지 제한을 둘 수 있는데 이런 식으로 표기한다.

 

class A<T> where T : IBasicFunc

 

 

 

 

 

 

다음은 델리게이트(Delegate)

델리게이트는 함수들 사이에 대리자? 연락책? 이라고 생각하면 된다.

 

예를 들어 어떤 아이템을 획득하면 스토리가 진행된다고 하자.
인벤토리의 update에서 언제 스토리를 진행해야할지 몰라서 지금 아이템을 가지고 있는지 1프레임마다 확인한다.
어마어마한 인력낭비다…

델리게이트를 사용하면 이렇게 된다.

인벤토리는 인벤토리대로 작동하다가 다음 스토리로 진행해도 되는 조건에서 이렇게 말한다.
“지금부터 아이템A 입수하면 다음 챕터가 진행될거야! 아이템을 획득하면 B 스크립트를 진행할게!”
그리고도 내내 일을 하다가 아이템 입수가 확인되면 B 스크립트를 호출해준다.

 

음… 자세한 설명은 아래 링크가 더 잘해주고 있다… 한번 읽어보고 오자.

 

https://daekyoulibrary.tistory.com/entry/C-%EC%BD%9C%EB%B0%B1-%ED%95%A8%EC%88%98Callback%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EB%8C%80%EB%A6%AC%EC%9E%90Delegate%EB%8A%94-%EB%AD%98%EA%B9%8C

 

사용할때는

 

delegate void 델리게이트이름(int a);

이런 식으로 선언한다.

 

델리게이트이름 a = new 델리게이트이름(함수이름);                      // 델리게이트에 함수를 넣어준다.
델리게이트이름(1);                                                                         // 이런 식으로 함수를 실행시킨다.

 

델리게이트의 장점

1. 일종의 함수 리스트처럼 쓰일 수 있음.

 

델리게이트는 반환형식과 매개변수 형식만 같으면 여러개의 함수를 한 델리게이트에 넣을 수 있다.

void A(int a)
void B(int a)
void C(int a)
를 모두 delegate void ABCFunc(int a) 에 할당할 수 있다.

 

2. 델리게이트를 사용하는 쪽 class에서 출력 구문을 바꿀 수 있다.(코드 정리용도? / 링크참조)

 

3. 결국은 실행시킬 함수를 매개변수로 사용하는 것이다.

 

함수에서 void A (int num) 이라고 선언하면

함수 내부의 지역 변수로

int num = new int();

int num = 호출될때 받은 매개변수 값

을 실행하는 것과 같기 때문에 delegate를 선언하고 함수를 집어넣는 것을 동시에 해주는 셈이다.

 

델리게이트는 일종의 함수를 매개변수로 내보낼 수 있는 수단? 일수도 있다.

 

void 함수(delegate Func)
이런 식으로 사용해서 Func에 보낼 함수를 인자로 다른 스크립트에 보내버릴수도 있다!(아마도)

 

 

 

 

번외)

delegate 체인???

아니 delegate는 하나의 함수를 지정해줘서 그거를 실행시킨다고 생각했는데 좀 찾아보니

이놈, 여러개의 함수를 한꺼번에 담을 수도 있는 그릇이었다............

 

void delegate DelegateA(int a)
라고 정의해두고

DelegateA a;
a = new DelegateA(함수1);
a += 함수2;
a += 함수3;

그리고 a();를 실행시키면 함수1, 함수2, 함수3이 순서대로 호출된다ㄷㄷ...
개사기 능력...

여러개의 메소드를 한꺼번에 참조할수도 있음 << 이건 좀 편리할 것 같다. 나중에 기회되면 써보기