ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [week8] Delegate
    UE5 2025. 4. 25. 15:29

    Delegate는 '관심사 분리'를 도와주는 도구이다.

    • 발신자(Subject): "어떤 일이 일어났어!"라고 말만 함
    • 구독자(Observer): "그 일이 일어나면 내가 할 일을 정해둘게!"
    • 이때 델리게이트는 '함수 호출만' 하니까, 내부 구현은 전혀 몰라도 됨

    Delegate를 쓰지 않는다면, 직접 참조 방식을 쓰게 된다.

    class School
    {
        Student* student;
    
    public:
        void SetStudent(Student* s) { student = s; }
    
        void ChangeAcademicInfo()
        {
            // 학사 정보 바뀜
            // 그에 따라 학생의 내부 상태를 직접 바꿈
            student->SetMood("슬픔");
            student->GoHomeEarly();
        }
    };

     

    이렇게 School이 Student의 내부 상태(SetMood, GoHomeEarly)에 대해 알고 있다.

    즉, Student가 바귀면 학교의 코드도 바뀌어야 한다. (함수가 변경될 가능성 항상 존재)

    이는 유지보수가 힘들어지고, 유닛 테스트가 어려워지는 결과를 낳는다.

     

    이 때, Delegate를 사용하면?

    class School
    {
    public:
        FSimpleMulticastDelegate OnAcademicInfoChanged;
    
        void ChangeAcademicInfo()
        {
            // 학사 정보 바뀜
            OnAcademicInfoChanged.Broadcast();  // "일어났어!"만 알림
        }
    };
    
    class Student
    {
    public:
        void Subscribe(School* school)
        {
            school->OnAcademicInfoChanged.AddUObject(this, &Student::ReactToInfoChange);
        }
    
        void ReactToInfoChange()
        {
            SetMood("슬픔");
            GoHomeEarly();
        }
    };

     

    School에서는 Student의 내부 구조를 몰라도 되며, 심지어 내부 구조 뿐만 아니라 Student의 존재 자체를 몰라도 된다.

    즉, School은 자신의 구독자가 누구인지 전혀 몰라도 된다.

    -> Parent, Student, NewsReporter 등 여러 객체가 다양하게 구독 가능하다.

    'UE5' 카테고리의 다른 글

    [week6] Light  (1) 2025.04.12
    [week5] PixelShader - Fog  (1) 2025.04.04
    [week2] Texture Rendering  (1) 2025.03.20
    [UE5] Development Editor에서 효과적으로 디버깅하는 방법  (1) 2025.01.17
    [CG] 레스터라이저 상태(Rasterizer State)  (1) 2025.01.15
Designed by Tistory.