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