TIL: C++, Unreal Delegate

๋ฐ•์ถ˜ํŒ”ยท4์ผ ์ „

CPP TIL

๋ชฉ๋ก ๋ณด๊ธฐ
5/7

๐Ÿ“… 2026-04-04
์ฃผ๋ง์—๋„ ์กฐ๊ธˆ์”ฉ์€ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Delegate

Delegate๋ž€?

Delegate๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ

Delegate = ๋‹จ์ˆœ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ + ๊ธฐ๋Šฅ ํ™•์žฅ

  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜ ๋“ฑ๋ก ๊ฐ€๋Šฅ(์ด๋ฒคํŠธ์ฒ˜๋Ÿผ)
  • ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋„ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
  • ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

"A์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ Bํ•จ์ˆ˜ ์‹คํ–‰ํ•ด์ค˜"

C++์—๋Š” Delegate ํ‚ค์›Œ๋“œ๋กœ์„œ๊ฐ€ ์•„๋‹Œ ๊ฐœ๋…์œผ๋กœ ์กด์žฌ
Delegate๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• ์กด์žฌ

C++ ๊ตฌํ˜„

ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

void Hello()
{
	std::cout << "Hello";
}

...

int main()
{
	void (*func)() = Hello;
    func();

}

๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ง€๋งŒ ์œ ์—ฐ์„ฑ์ด ์—†์Œ

std::function

void Hello()
{
	std::cout << "Hello";
}

...

int main()
{
	std::function<void()> func = Hello;

    func();
}	

ํ•จ์ˆ˜, ๋žŒ๋‹ค, ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋‹ค ๊ฐ€๋Šฅ
๋งค์šฐ ์œ ์—ฐํ•จ

std::function<void()>
voidํ˜•์‹์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ์–ธ

func = Hello;
func์— Hello ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ

Lambda

auto func = []() {
	std::cout << "Lambda";
};

func();

inline delegate ๋А๋‚Œ
์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋งŽ์ด ์‚ฌ์šฉ

Unreal ๊ตฌํ˜„

unreal์—์„œ๋Š” Delegate๋ฅผ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ

  • Single-cast Delegate

    ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋งŒ ์—ฐ๊ฒฐ

  • Multi-cast Delegate

    ์—ฌ๋Ÿฌ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ (์ด๋ฒคํŠธ st)

  • Dynamic Delegate

    ๋ธ”๋ฃจ ํ”„๋ฆฐํŠธ ์—ฐ๋™ ๊ฐ€๋Šฅ

Delegate ์„ ์–ธ

DECLARE_DELEGATE(FMyDelegate);

ํ•จ์ˆ˜ ๋ฐ”์ธ๋”ฉ + ์‹คํ–‰

void MyFunction()
{
	UE_LOG(LogTemp, Warning, TEXT("Hello Delegate"));
}

FMyDelegate Delegate;

Delegate.BindStatic(&MyFunction);
Delegate.Execute();

๋ฉ€ํ‹ฐ์บ์ŠคํŠธ Delegate

DECLARE_MULTICAST_DELEGATE(FmyMultiDelegate);

FMyMultiDelegate OnSomething;

void Func1() { ... }
void Func2() { ... }
    
OnSomething.AddStatic(&Func1);
OnSomething.AddStatic(&Func2);
    
OnSomething.Broadcast();

Unreal์—์„œ ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ

OnDamaged.Broadcast(NewHealth);

๋ฐ๋ฏธ์ง€ ์ž…์„ ๊ฒฝ์šฐ NewHealth ํ•จ์ˆ˜ ์‹คํ–‰

์ž…๋ ฅ ์ฒ˜๋ฆฌ

InputComponent->
BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);

๋‚ด๋ถ€์ ์œผ๋กœ Delegate ์‚ฌ์šฉ

InputComponent->
InputComponent์˜ ๋ฉค๋ฒ„ ์ ‘๊ทผ

BindAction( ... )
ํ•จ์ˆ˜ ํ˜ธ์ถœ

๋‚ด๋ถ€์ธ์ž๋“ค ("Jump", IE_Pressed, this, &ACharacter::Jump)
Jump
์•ก์…˜ ์ด๋ฆ„

IE_Pressed
์ž…๋ ฅ ์ด๋ฒคํŠธ ํƒ€์ž…

  • ๋ˆŒ๋ฆผ
  • ๋–ผ์ง
  • ๋ฐ˜๋ณต

this
ํ˜„์žฌ ๊ฐ์ฒด

&ACharacter::Jump();
์ด ํด๋ž˜์Šค์˜ Jump ํ•จ์ˆ˜ ์ฃผ์†Œ

ํƒ€์ด๋จธ

GetWorld()->GetTimerManager().SetTimer(
	TimerHandle,
    this,
    &AMyActor::MyFunction,
    1.0f,
    false
);

ํŠน์ • ์‹œ๊ฐ„ ํ›„ ํ•จ์ˆ˜ ํ˜ธ์ถœ

profile
์ด๊ฒƒ ์ €๊ฒƒ ๋‹คํ•ด๋ณด๋Š” ์‚ถ

0๊ฐœ์˜ ๋Œ“๊ธ€