UE5

[week8] Delegate

검정색필통 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 등 여러 객체가 다양하게 구독 가능하다.