본문 바로가기

프로그래밍/언리얼엔진

델리게이트(DELEGATE)

*DECLARE_DELEGATE의 종류와 Bind, Add등 바인딩 키워드

델리게이트 : 함수를 안전하게 호출할 수 있는 기능, 동일한 리턴값과 인자 타입을 가지는 여러개를 관리

 

장점) 간편한 문법과 안전성을 갖춰 콜백함수를 호출 가능

 

특징) 발행/구독의 패턴 

 ㄴex) 신문의 구독자가 신문 구독의 의사를 밝히고 등록하면 신문이 발행될 때 마다 동일한 시간대에 모든 구독자의 집에 신문이 배달되듯, 특정 이벤트 발생 시 델리게이트의 모든 함수를 한꺼번에 호출 가능.

ㄴex2) 보스가 죽는 이벤트를 델리게이트로 등록 후 보스가 소환한 미니언들이 이를 구독하면 보스가 죽을 때 모든 미니언에게 호출 가능하다.

 

  • 함수 포인터의 직접 접근이 아닌 대리자를 통한 함수 호출 방식
  • 호출할 함수나 이를 포함하는 객체가 없어져도, 대리자가 체크해 안전하게 처리
  • 동일한 형을 가진 함수 여러 개를 대리자가 묶어서 관리하고, 필요할 때 동시에 모두 호출  가능

다이나믹 델리게이트 : (함수포인터가 아닌) 함수의 이름을 기반으로 등록해 호출하는 방식

 

  • C++, 블루프린트 함수도 딜리게이트 시스템에 연결이 가능
  • 이름 기반으로 저장이 가능
  • 단점 : 동작이 느림
바인딩
  • BindDynamic(UserObject, FuncName) : 다이나믹 게이트에서 BindDynamic을 호출하기 위한 헬퍼 매크로로 함수 이름 문자열을 자동 생성.
  • AddDynamic(UserObject, FuncName) : 다이나믹 멀티-캐스트 델리게이트에서 AddDynamic() 호출을 위한 헬퍼 매크로로 함수 이름 문자열을 자동 생성.
  • RemoveDynamic(UserObject, FuncName) : 다이나믹 멀티-캐스트 델리게이트에서 RemoveDynamic() 호출을 위한 헬퍼 매크로로 함수 이름 문자열을 자동 생성.

 

델리게이트에 바인딩된 함수는 델리게이트의 Execute() 함수를 호출하여 실행.

델리게이트를 실행하기 전 바인딩이 되었는지 확인 해야함.

초기화되지 않은 상태로 접근이 가능한 반환값과 출력 파라미터가 델리게이터에 있는데 실행시키면 일부 인스턴스에서 메모리 누수가 일어날 수 있음.

 

실행해도 안전한지 확인하기 위해서는 IsBound()를 호출, 반환값이 없는 델리게이트는 ExecuteIfBound()를 호출할 수 있으나 출력파라미터는 초기화 되지 않을 수 있어 주의가 필요함.

 


멀티캐스트 델리게이트 : 여러 개의 함수를 받을 수 있어서 행동이 끝나면 등록된 모든 함수들에게 모두 알려주는 기능을 제공한다.

 

  • C++, 블루프린트 함수도 딜리게이트 시스템에 연결이 가능
  • 여러개를 사용하기 위해선 DECLARE_DELEGATE이 아닌 DECLARE_MULTICAST_DELEGATE 매크로를 사용해야 한다.

바인딩

  • Add() : 이 멀티캐스트 델리게이트의 실행 목록에 함수 델리게이트를 추가
  • AddStatic() : raw C++ 포인터 글로벌 함수 델리게이트를 추가한다.
  • AddRaw() : raw C++ 포인터 델리게이트를 추가한다. raw 포인터는 어떠한 레퍼런스도 사용하지 않아 오브젝트가 자신의 델리게이트 하에서 삭제된 경우 호출시 안전하지 않을 수 있다. Execute() 호출시 주의
  • AddSP() : 공유 포인터 기반 (빠르지만 스레드 안전성이 떨어진다.) 멤버 함수 델리게이트를 추가한다. 공유 포인터 델리게이트는 자신의 오브젝트에 대한 약 레퍼런스를 유지한다.
  • UObject 기반 멤버 함수 델리게이트를 추가한다. UObject 델리게이트는 자신의 오브젝트에 대한 약 래퍼런스를 유지한다.
  • Remove() : 이 멀티캐스트 델리게이트의 실행 목록에서 함수를 제거.
  • RemoveAll() : 지정된 UserObject에 바인딩된 이 멀티캐스트 델리게이트의 실행 목록에서 모든 함수를 제거.

멀티캐스트 델리게이트의 Broadcast() 함수를 호출하여 그 모두를 동시에 실행 가능.

호출은 아무 것도 바인딩 되어있지 않아도 안전하다.

다만, 델리게이트를 사용해 출력 변수를 초기화 시킬 때는 좋지 않다.

Broadcast()호출 시 함수의 실행 순서는 정의되지 않는다.

Broadcast() : 이 델리게이트는 만료되었을 수도 있는 것을 제외하고, 바인딩된 모든 오브젝트에 뿌린다.

 


다이나믹 멀티캐스트 델리게이트 : C++, 블루프린트 함수도 연결 + 블루프린트에서 사용할 수 있게

딜리게이트를 블루프린트 함수와 연동하고 싶을 때

Dynamic + Multicast인

DECLARE_DYNAMIC_MULTICAST_DELEGATE 매크로를 사용한다.