-
[week8] DelegateUE5 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