강한 결합과 느슨한 결합
- 강한 결합
- 클래스들이 서로 의존성을 가지는 경우를 의미
- 아래 예시에서 Card가 업슨 경우 Person이 만들어 질 수 없다.
- 이 때 Person은 Card에 대한 의존성을 가진다고 한다.
- 핸드폰에서도 인증할 수 있는 새로운 카드가 도입된다면?
- 느슨한 결합
- 실물에 의존하지 말고 추상적 설계에 의존하라. (DIP 원칙)
- 왜 Person은 Card가 필요한가?
-> 출입을 확인해야 하기 때문
-> 출입에 관련된 추상적인 설계에 의존하자.
- ICheck를 상속받은 새로운 카드 인터페이스를 선언해 해결
- 이러한 느슨한 결합 구조는 유지 보수를 손쉽게 만들어준다.

델리게이트
그렇다면 함수를 오브젝트처럼 관리하면 어떨까?
- 함수를 다루는 방법
- 함수 포인터를 활용한 콜백 함수의 구현
- 가능은 하나 이를 정의하고 사용하는 과정이 꽤나 복잡함
- 안정성을 스스로 검증해주어야 함
- C++17 구약의 std::bind와 std::function 활용은 느림
- C#의 델리게이트 키워드
- 함수를 마치 객체처럼 다룰 수 있음
- 안정적이고 간편한 선언
- 언리얼 C++도 델리게이트를 지원함.
- 느슨한 결합 구조를 간편하고 안정적으로 구현할 수 있음.
언리얼 엔진 델리게이트
- 델리게이트
- 어떤 객체가 가지고 있는 멤버 함수와 delegate를 연결해서 느슨한 결합을 만들 수 있음
- 델리게이트 오브젝트는 복사해도 완벽히 안전
- 가급적이면 델리게이트는 참조 전달
- 매크로 제공
- 일대일, 일대다, 저장할 것, 블루프린트 연동 등에 대한 매크로
- 델리게이트 바인딩
- 선언한 델리게이트를 멤버함수, 일반함수, 정적함수 등 다양한 함수와 연결해주는 함수
- 페이로드 데이터
- 묶는 객체에 대한 정보를 지정해서 하나의 구문으로 편하게 묶을 수 있다는 것을 의미
- 델리게이트 실행
- execute()를 통해서 호출
- broadcast()로 일대다 호출도 가능
발행 구독 디자인 패턴
- 푸시형태의 알림을 구현하는데 적합한 디자인 패턴
- 발행자와 구독자로 구분된다
- 콘텐츠 제작자는 콘텐츠를 생산한다.
- 발행자는 콘텐츠를 배포한다
- 구독자는 배포된 콘텐츠를 받아 소비한다.
- 제작자와 구독자가 서로를 몰라도, 발행자를 통해 콘텐츠를 생산하고 전달할 수 있다.
- 발행 구독 디자인 패턴의 장점
- 제작자와 구독자는 서로를 모르기 때문에 느슨한 결합으로 구성된다.
- 유지 보수가 쉽고, 유연하게 활용될 수 있으며, 테스트가 쉬워진다.
- 시스템 스케일을 유연하게 조절할 수 있으며, 기능 확장이 용이하다
실습
학교에서 진행하는 온라인 수업 활동 예시
- 학사정보와 학생
- 학교는 학사 정보를 관리한다
- 학사 정보가 변경되면 자동으로 학생에게 알려준다.
- 학생은 학사 정보의 알림 구독을 해지할 수 있다.
- 시나리오
- 학사 정보와 3명의 학생이 있다.
- 시스템에서 학사 정보를 변경한다.
3.학사 정보가 변경되면 알림 구독한 학생들에게 변경 내용을 자동으로 전달한다.
언리얼 델리게이트
- 언리얼 엔진은 발행 구독 패턴 구현을 위해 델리게이트 기능을 제공함.
- 델리게이트의 사전적 의미는 대리자.
- 시나리오 구현을 위한 설계
- 학사 정보는 구독과 알림을 대행할 델리게이트를 선언
- 학생은 학사 정보의 델리게이트를 통해 알림을 구독
- 학사 정보는 내용 변경시 델리게이트를 사용해 등록한 학생들에게 알림

언리얼 델리게이트 선언 시 고려사항
- 델리게이트 선언시 고려사항
- 어떤 데이터를 전달하고 받을 것인가? 인자의 수와 각각의 타입을 설계
- 몇개의 인자를 전달할 거인가?
- 어떤 방식으로 전달할 것인가?
- 일대일로 전달
- 일대다로 전달
- 프로그래밍 환경 설정
- C++ 프로그래밍에서만 사용할 것인가?
- UFUNCTION으로 지정된 블루프린트 함수와 사용할 것인가?
- 어떤 함수와 연결할 것인가?
- 클래스 외부에 설계된 C++ 함수와 연결
- 전역에 설계된 정적 함수와 연결
- 언리얼 오브젝트의 멤버 함수와 연결 (대부분의 경우에 이 방식을 사용)
언리얼 델리게이트 선언 매크로
DECLARE_{델리게이트 유형}DELEGATE{함수정보}
언리얼 델리게이트의 설계
- 학사 정보 클래스와 학생 클래스의 상호 의존성을 최대한 없앤다.
- 하나의 클래스는 하나의 작업에만 집중하도록 설계
- 학사 정보 클래스는 델리게이트를 선언하고 알림에만 집중
- 학생 클래스는 알림을 수신하는데만 집중
- 직원도 알림을 받을 수 있도록 유연하게 설계
- 학사 정보와 학생은 서로 헤더를 참조하지 않도록 신경쓸 것.
- 이를 위해 발행과 구독을 컨트롤하는 주체를 설정
- 학사 정보에서 선언한 델리게이트를 중심으로 구독과 알림을 컨트롤하는 주체 설정
정리
- 느슨한 결합이 가지는 장점
- 향후 시스템 변경 사항에 대해 손쉽게 대처 가능
- 느슨한 결합으로 구현된 발행 구독 모델의 장점
- 클래스는 자신이 해야 할 작업에만 집중 가능
- 외부에서 발생한 변경 사항에 대해 영향받지 않음
- 자신의 기능을 확장하더라도 다른 모듈에 영향을 주지 않음
- 언리얼 C++의 델리게이트의 선언 방법과 활용
- 몇 개의 인자를 가지는가?
- 어떤 방식으로 동작하는가? (MULTICAST 사용 유무)
- 언리얼 에디터와 함께 연동하는가? (DYNAMIC 사용 유무)
- 이를 조합해 적합한 매크로 설정
데이터 기반의 디장니 패턴을 설계할 때 유용하게 사용