언리얼C++ 설계(3) - 델리게이트
- 언리얼 델리게이트를 사용해 클래스 간의 느슨한 결합 구현
- 어떤 객체를 사용을 할 때 객체 자체에 강한 결합을 하는 것이 아니고 어떤 객체가 가지고 있는 멤버 함수와 delegate를 연결해 가지고 느슨한 결합을 만들 수 있다.
- 델리게이트는 항상 참조 전달해야 한다.
강한 결합과 느슨한 결합
- 강한 결합: 클래스들이 서로 의존성을 가지는 경우를 의미.
- Card가 없는 경우 Person이 만들어질 수 없다.(Person은 Card에 대한 의존성을 가진다.)
- 이 때 새로운 카드가 도입된다면?
- 느슨한 결합: 실물에 의존하지 말고 추상적 설계에 의존.(DIP 원칙)
- Person에게 Card가 필요한 이유? 출입을 확인해야 하기 때문.
- 느슨한 결합 구조는 유지 보수를 손쉽게 만들어줌.
델리게이트
- C#의 델리게이트 키워드: 함수를 마치 객체처럼 다룰 수 있음, 안정적이고 간편한 선언
- 언리얼 C++도 델리게이트를 지원함.
발행 구독 디자인 패턴
- 푸시 형태의 알림을 구현하는데 적합한 디자인 패턴
- 발행자와 구독자로 구분.
- 콘텐츠 제작자: 콘텐츠 생산.
- 발행자: 콘텐츠 배포.
- 구독자: 배포된 콘텐츠를 받아 소비.
- 중간에 발행자라는 존재가 있기 때문에 제작자와 구독자는 느슨한 결합관계를 유지할 수가 있게 되는 것.
언리얼 델리게이트
- 언리얼 엔진은 발행 구독 패턴 구현을 위해 델리게이트 기능을 제공함.
- 콘텐츠 제작자는 배포를 대행할 델리게이트(발행자)를 선언.
- 구독자는 델리게이트(발행자)를 통해 콘텐츠를 구독.
- 콘텐츠 제작자는 내용 변경시 델리게이트(발행자)를 사용해 등록한 구독자들에게 알림.
언리얼 델리게이트의 선언
- 어떤 데이터를 전달하고 받을 것인가?(인자의 수와 각각의 타입)
- 몇 개의 인자를 어떤 방식으로, 일대일로, 일대다로 전달
- 프로그래밍 환경 설정
- C++ 프로그래밍에서만? UFUNCTION으로 지정된 블루프린트 함수와 사용?
- 어떤 함수와 연결할 것인가?
- 클래스 외부에 설계된 C++ 함수, 전역에 설계된 정적 함수, 언리얼 오브젝트의 멤버 함수(대부분의 경우)
언리얼 델리게이트 선언 매크로
DECLARE_{델리게이트 유형}DELEGATE{함수정보}
- 델리게이트 유형
- 일대일 형태, C++만 지원: 공란
- 일대다 형태, C++만 지원: MULTICAST
- 일대일 형태, 블루프린트 지원: DYNAMIC
- 일대다 형태, 블루프린트 지원: DYNAMIC_MULTICAST
- 함수 정보
- 인자가 없고, 반환값도 없음: 공란
- 인자가 하나, 반환값이 없음: OneParam
- 인자가 세 개, 반환값이 있음: RetVal_ThreeParams
- MULTICAST(일대다)는 반환값을 지원하지 않음, 파라미터는 최대 9개까지 지원
정리
- 느슨한 결합
- 향후 시스템 변경 사항에 대해 손쉽게 대처할 수 있음.
- 클래스는 자신이 해야 할 작업에만 집중.
- 외부에서 발생한 변경 사항에 대해 영향받지 않음.
- 자신의 기능을 확장하더라도 다른 모듈에 영향을 주지 않음.
- 언리얼 C++ 델리게이트의 선언 방법과 활용