TIL/Unity

[Unity] 델리게이트(Delegate)는 뭘까?

Sh_Blog 2024. 2. 2. 22:45

 

유니티에서 콜백기능이라고 하면 딱 떠오르는 대표적인 개념이 하나 있는데

그것이 바로 델리게이트다. 실제로 델리게이트를 사용해본 경험도 있고

사용하는 이유도 어느정도 알고 있지만 정확하게 개념을 파악하진 못했다.

그래서 이번에 확실하게 이해를 하고 넘어가고 싶어 델리게이트에 대해 정리해 보려 한다.

 

1. Delegate란 뭘까?

Delegate를 한국어로 번역하면 대리자, 대표자 라는 뜻이 나오는데

말 그대로 대리자의 역할을 하는 것이 Delagete다.

 

따라서 Delegate는 메서드에 대한 참조를 나타내며 이를 통해 메서드를 매개변수로 전달하거나

변수에 저장할 수 있는 실체로 처리할 수 있는 대리자다.

 

근데 메서드에 대한 참조, 메서드를 매개변수로 전달.. 뭔가 말이 되게 복잡하다. 그래서 코드 예시와

함께 이 말들이 무슨 의미인지 알아보자.

현재 DelegateExam이라는 클래스 안에는 delegate로 선언된 OutputString과

OutputHello, OutputBye 메서드가 존재한다.

 

Start부분에서 델리게이트 OutputString의 객체를 생성하며 메서드 OutputHello를 넣어줬다.

다음으로 Debug.Log를 사용하여 outputString 델리게이트를 실행했더니 

Hello가 나왔다.

분명 델리게이트를 실행했는데 OutputHello의 메서드가 실행됐다.

그럼 이 부분이 의미하는 것은 현재 델리게이트는 OutputHello라는 메서드를

참조하고 있다는 것이다. 쉽게 말해서 델리게이트야, 너가 지금 참조하고 있는

메서드를 실행 시켜줘! 라는 의미다.

 

더 쉽게 설명하자면 A란 사람이 맛있는 치킨을 먹기위해 배민의 치킨순위를 참조했다.

라고 하면 A야 너가 맛있는 치킨을 먹기위해 참조한 배민의 치킨순위를 알려줘! 라고 말한것 이고

그럼 A는 그래! 현재 배민의 치킨순위 1위는 ~~회사거야. 라고 말해주는 것이다.

 

그럼 아래도 마찬가지로 델리게이트 객체에 OutputBye를 참조시켜 줬으니

Debug.log의 출력은 Bye가 나올 것이다.

 

그럼 메서드를 매개변수로 전달한다는 의미를 알아보자.

 

우선 델리게이트 객체 outputString이 OutputHello를 참조하고 있다는 것은

이전의 내용 설명으로 이미 알고 있을 것이다.

 

그럼 PerformOutputString이라는 메서드에 델리게이트 객체를 매개변수로 전달한다면

어떻게 될까?

 

현재 델리게이트 객체가 참조하고 있는 OutputHello 메서드가 실행되어 Hello가 출력된 것을 볼 수 있다.

OutputBye도 다음 과정에서 참조하고 있기 때문에 Bye가 출력됐다.

 

이런 결과를 보아 메서드를 매개변수로 전달할 수 있는 대리자 의 특징을 가지고 있다는 것을 알 수 있다.

 

결론

Delegate는 참조한 메서드를 불러올 수 있는 대리자 역할을 하는 기능이다.

 

 

2. Delgate를 쓰면 뭐가 좋은거야?

 

지금까지 델리게이트가 어떤 기능을 하며 어떤 식으로 동작하는지 알아봤다.

근데 정작 이게 무슨 장점을 가지는지 확실히 모르기 때문에 하나씩 살펴보도록 하겠다.

 

 

지금 DelegateExam 클래스에서 PreformDelegate 메서드가

실행되면 outputString 객체가 참조하고 있는 메서드를 실행 할 것이다.

 

 

Key클래스에서는 DelegateExam 클래스에 있는 델리게이트에 CustomAction이라는 메서드를 

연결해주었고 PerformDelegate 메서드를 Start부분에서 실행하고 있다.

 

그럼 DelegateExam 클래스의 입장에서 봤을 때 델리게이트 outputString 객체에 어떤 메서드가 연결되있는지

모른다. 하지만 PerformDelegate가 실행되면 어느 클래스에서 outputString에 연결되있는 메서드가 실행된다.

 

이 말은 DelegateExam 클래스는 Key클래스에서 어떤 메서드를 연결했는지 알 필요가 없고 알 수도 없기 때문에

캡슐화의 기능을 하며 결합도의 느슨함으로 유연성도 증가했다.

 

그리고 PerformDelegate 메서드가 실행될 때만 Delegate에 연결된 메서드가 실행되기 때문에 콜백기능을 가능하게

해줘 비동기 프로그래밍을 가능하게 해준다. 또한 Delegate 객체에 동적으로 런타임에 메서드를 할당 할 수 있어서 동적 메서드 호출을 가능하게 해준다.

 

근데 보통 Delegate를 생성하고 객체를 생성하는 방법보다는 Delegate + event를 사용하여 Delegate를 

event로 선언하고 다른 클래스에서 구독하는 형식으로 자주 사용된다.

 

결론

델리게이트는 캡슐화로 인하여 모듈화 되고 유연한 설계가 가능하며 콜백으로 인한 비동기 프로그래밍과

동적 메서드 호출로 유지 관리 측면에서 큰 이점을 얻을 수 있기 때문에 사용한다.