본문 바로가기

공부/이득우의 언리얼 프로그래밍

[Study] Part 1 - 언리얼 C++ 설계 Ⅲ - 델리게이트 (9/15)

728x90
반응형

 

 

 

 

델리게이트

C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형입니다.

dev.epicgames.com

 

  • 정리
    • 언리얼 C++ 델리게이트
      1. 느슨한 결합(Loose Coupling)이 가지는 장점
        1. 향후 시스템 변경 사항에 대해 손쉽게 대처할 수 있음
      2. 느슨한 결합(Loose Coupling)으로 구현된 발행 구독 모델의 장점
        1. 클래스는 자신이 해야 할 작업에만 집중할 수 있음
        2. 외부에서 발생한 변경 사항에 대해 영향받지 않음
        3. 개까지 지원자신의 기능을 확장하더라도 다른 모듈에 영향을 주지 않음
      3. 언리얼 C++의 델리게이트 선언 방법과 활용
        1. 몇 개의 인자를 가지는가?
        2. 어떤 방식으로 동작하는가? (MULTICAST 사용 유무 결정)
        3. 언리얼 에디터와 함께 연동할 것인가? (DYNAMIC 사용 유무 결정)
        4. 이를 조합해 적합한 매크로 선택
    • 데이터 기반의 디자인 패턴을 설계할 때 유용하게 사용

 

 

  • 강한 결합과 느슨한 결합

강한 결합과 느슨한 결합 예시

 

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

 

  • 느슨한 결합의 간편한 구현 - 델리게이트(Delegate)

느슨한 결합의 간편한 구현 - 델리게이트(Delegate) 예시

 

  • 함수를 오브젝트처럼 관리한다면?
    • 함수를 다루는 방법
    • 함수 포인터를 활용한 콜백 함수의 구현
    • 가능은 하나 이를 정의하고 사용하는 과정이 꽤나 복잡함
    • 안정성을 스스로 검증해주어야 함
    • C++ 17 구약의 std::bind와 std::function 활용은 느림
  • C#의 델리게이트(delegate) 키워드
    • 함수를 마치 객체처럼 다룰 수 있음
    • 안정적이고 간편한 선언
  • 언리얼 C++도 델리게이트를 지원함
    • 느슨한 결합 구조를 간편하고 안정적으로 구현할 수 있음

 

 

  • 발행 구독 디자인 패턴

발행 구독 디자인 패턴 예시

 

 

  • 푸시(Push)형태의 알림(Notification)을 구현하는데 적합한 디자인 패턴
  • 발행자(Publisher)구독자(Subscriber)로 구분된다.
    • 콘텐츠 제작자는 콘텐츠를 생산
    • 발행자는 콘텐츠를 배포
    • 구독자는 배포된 콘텐츠를 받아 소비
    • 제작자와 구독자가 서로를 몰라도, 발행자를 통해 콘텐츠 를 생산하고 전달할 수 있다. (느슨한 결합)
  • 발행 구독 디자인 패턴의 장점
    • 제작자와 구독자는 서로를 모르기 때문에 느슨한 결합으로 구성
    • 유지 보수(Maintenance)가 쉽고, 유연하게 활용될 수 있으며(Flexibility), 테스트가 쉬워진다.
    • 시스템 스케일을 유연하게 조절할 수 있으며(Scalability), 기능 확장(Extensibility)이 용이하다.
  • 언리얼 델리게이트 선언시 고려사항
    • 어떤 데이터를 전달하고 받을 것인가? 인자의 수와 각각의 타입을 설계
      • 몇 개의 인자?
      • 어떤 방식?
      • 일대일?
      • 일대다?
    • 프로그래밍 환경 설정
      • C++ 프로그래밍에서만?
      • UFUNCTION으로 지정된 블루프린트 함수와 사용?
    • 어떤 함수와 연결할 것인가?
      • 클래스 외부에 설계된 C++함수와 연결?
      • 전역에 설계된 정적 함수와 연결?
      • 언리얼 오브젝트의 멤버 함수와 연결? (대부분의 경우에 이 방식을 사용)

 

 

 

  • 고려사항에 맞춰 언리얼 델리게이트 선언 매크로를 사용한다.
    • DECLARE_{델리게이트유형}DELEGATE{함수정보}

 

  • 델리게이트 유형 : 어떤 유형의 델리게이트인지 구상
    • 일대일 형태로 C++만 지원한다면 유형은 공란으로
      DECLARE_DELEGATE
    • 일대다 형태로 C++만 지원한다면 MULTICAST를 선언
      DECLARE_MULTICAST
    • 일대일 형태로 블루프린트를 지원한다면 DYNAMIC을 선언
      DECLARE_DYNAMIC
    • 일대다 형태로 블루프린트를 지원한다면 DYNAMIC과 MULTICAST를 조합
      DECLARE_DYNAMIC_MULTICAST
  • 함수 정보 : 연동 될 함수 형태를 지정
    • 인자가 없고 반환값도 없으면 공란
    • 인자가 하나고 반환값이 없으면 OneParam으로 지정
    • 인자가 세 개고 반환값이 없으면 RetVal_ThreeParams로 지정
    • 최대 9개까지 지원

 

 

 

 

해당 포스트는 인프런의 <이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해>
강의를 수강하고 정리한 내용입니다.
 

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해 | 이득우 - 인프런

이득우 | 대기업 현업자들이 수강하는 언리얼 C++ 프로그래밍 전문 과정입니다. 언리얼 엔진 프로그래머라면 게임 개발전에 반드시 알아야 하는 언리얼 C++ 기초에 대해 알려드립니다., [사진] 언.....................

www.inflearn.com

 

 

 

 

 

728x90