강한 결합(Tight Coupling)과 느슨한 결합(Loose Coupling)
- 강한 결합
- 클래스들이 서로 의존성을 가지는 경우
- 새로운 기능이 생긴다면?
- 부모나 자식을 고치게 되면 다 고쳐야할 수도 있음
- 느슨한 결합
- DIP 원칙: 실물에 의존하지 말고 추상적 설계에 의존
- 필요한 기능에 대한 추상적인 설계
- 인터페이스를 선언해 해결
- 느슨한 결합 구조는 유지 보수를 쉽게 해줌
델리게이트
- 함수를 오브젝트처럼 관리
- callback이나 std::function이 있지만 복잡하고 활용이 느림
- C#의 델리게이트처럼 언리얼도 델리게이트 지원
https://docs.unrealengine.com/5.3/ko/delegates-and-lamba-functions-in-unreal-engine/
- 어떤 객체가 가지고 있는 멤버 함수와 delegate를 연결해서 느슨한 결합을 만들 수 있음
- 델리게이트 오브젝트는 복사해도 완벽히 안전
- 가급적이면 델리게이트는 참조 전달
- 선언 방법
- 매크로 제공
- 일대일, 일대다, 저장할 것, 블루프린트 연동 등에 대한 매크로
- 델리게이트 바인딩
- 선언한 델리게이트를 멤버함수, 일반함수, 정적함수 등 다양한 함수와 연결해주는 함수
- 페이로드 데이터
- 묶는 객체에 대한 정보를 지정해서 하나의 구문으로 편하게 묶을 수 있다는 것을 의미
- 델리게이트 실행
- execute()를 통해서 호출
- broadcast()로 일대다 호출도 가능
발행 구독 디자인 패턴
- 푸시(Push) 형태의 알림을 구현한느데 적합한 디자인 패턴
- 발행자(Publisher)와 구독자(Subscriber)로 구분
- 콘텐츠 제작자는 콘텐츠 생산
- 발행자는 콘텐츠를 배포
- 구독자는 배포된 콘텐츠를 받아 소비
- 제작자와 구독자가 서로 몰라도, 발행자를 통해 콘텐츠를 생산하고 전달할 수 있음(느슨한 결합)
- 발행 구독 디자인 패턴 장점
- 서로를 몰라 느슨한 결합
- 유지 보수가 쉬움
- 유연함
- 테스트 쉬워짐
- 시스템 스케일 조절 가능
- 기능 확장 용이
실습 예제
- CourseInfo와 Student
- 학교는 학사 정보 관리
- 학사 정보가 변경되면 자동으로 학생에게 알림
- 학생은 학사 정보 알림 구독 해지 가능
언리얼 델리게이트 선언
고려사항
- 어떤 데이터를 전달하고 받을 것인가
- 몇 개의 인자
- 어떤 방식으로 전달
- 일대일? 일대다?
- 프로그래밍 환경 설정
- C++ 프로그래밍만?
- UFUNTION으로 지정된 블루프린트 함수 사용?
- 어떤 함수와 연결
- 클래스 외부에 설계된 C++ 함수와 연결
- 전역에 설계된 정적 함수와 연결
- 언리얼 오브젝트의 멤버 함수와 연결
- 대부분의 경우 이 방식
매크로
- DECLARE_{델리게이트유형}DELEGATE{함수정보}
- 델리게이트 유형
- DECLARE_DELEGATE
- 일대일
- C++만 지원
- DECLARE_MULTICAST
- 일대다
- C++만 지원
- DECLARE_DYNAMIC
- 일대일
- 블루프린트 지원
- DECLARE_DYNAMIC_MULTICAST
- 일대다
- 블루프린트 지원
- 함수 정보
- 반환값이 있으면 _RetVal
- MULTICAST는 반환값 지원 X
- 인자 개수 따라 _OneParam, _TwoParams, ...
- 인자가 없으면 공란
- 최대 9개까지 지원
예) DECLARE_DELEGATE DECLARE_DELEGATE_OneParam ECLARE_DELEGATE_RetVal_ThreeParams
- 매크로 인자
- DelegateName
- F 접두사
- class 이름
- On (이벤트가 발생했다는 뜻)
- Changed (정보가 변경됐다는 뜻)
- Signature 접미사
- 예) FDelegateClassOnChangedSignature
- 인자 타입
실습
- 델리게이트용 클래스 구현
- 학생 클래스에서 알림 받는 함수 구현
- 둘의 연결을 GameInstance에서 담당
- GameInstance에서 델리게이트 클래스를 멤버 변수로
- TObjectPtr를 이용한 전방선언
- 델리게이트에 학생 정보를 추가
- AddUObject를 이용
- 객체와 함수를 넘겨줌
추가
- AddUObject는 콜백으로 등록할 함수가 c++ 클래스 멤버 함수일 때
- AddDynamic은 콜백으로 등록할 함수가 네트웍 RPC 및 블루프린트와 호환되는 UFUNCTION으로 지정된 C++ 클래스 멤버 함수일 때