델리게이트 (delegate)
C#에서 델리게이트는 특정 메서드를 가리키고 그 메서드를 나중에 호출할 수 있는 "포인터" 같은 역할을 합니다. 델리게이트를 사용하면 메서드를 매개변수로 전달하거나, 여러 메서드를 하나의 호출 리스트로 묶어 실행할 수 있습니다.
특히 이벤트와 콜백(callback)과 같은 상황에서 많이 활용됩니다.
델리게이트의 기본 개념
델리게이트는 특정한 형식의 메서드를 참조할 수 있는 타입입니다.
예를 들어, 반환 타입이 void이고 인자가 없는 메서드를 참조하는 델리게이트를 정의하려면 다음과 같이 작성합니다.
public delegate void MyDelegate();
다음은 델리게이트를 선언하고 사용하는 간단한 예시입니다
델리게이트의 사용 예
델리게이트는 주로 콜백 메서드를 구현하거나, 메서드들을 동적으로 호출해야 할 때 사용됩니다. 예를 들어, 어떤 작업이 끝난 후 특정 작업을 실행해야 하는 경우(예: 파일 다운로드 후 알림 출력) 델리게이트를 통해 콜백을 설정할 수 있습니다.
using UnityEngine;
public delegate void Notify();
public class Process : MonoBehaviour
{
public void StartProcess(Notify callback)
{
Debug.Log("작업을 수행 중입니다...");
// 작업 수행 로직
callback(); // 작업 완료 후 콜백 호출
}
}
public class DelegateCallbackExample : MonoBehaviour
{
void Start()
{
Process process = new Process();
process.StartProcess(CompletionNotification);
}
void CompletionNotification()
{
Debug.Log("작업이 완료되었습니다!");
}
}
위 코드에서 StartProcess 메서드는 Notify 델리게이트 타입의 콜백을 받아서 작업이 완료된 후 호출합니다. 이를 통해 코드 흐름을 유연하게 관리할 수 있습니다.
델리게이트와 이벤트
델리게이트는 이벤트(event)와 밀접한 관련이 있습니다. 이벤트는 특정 조건이 발생했을 때 알림을 보내는 메커니즘인데, 이를 구현할 때 델리게이트를 사용합니다. 예를 들어, 버튼을 클릭할 때 발생하는 이벤트를 처리하는 로직을 생각해볼 수 있습니다:
using UnityEngine;
public class Button : MonoBehaviour
{
public delegate void ClickHandler();
public event ClickHandler Click;
public void OnClick()
{
if (Click != null)
{
Click();
}
}
}
public class ButtonExample : MonoBehaviour
{
void Start()
{
Button button = new Button();
button.Click += ButtonClicked;
button.OnClick();
}
void ButtonClicked()
{
Debug.Log("버튼이 클릭되었습니다.");
}
}
Click 이벤트는 ClickHandler 델리게이트를 사용하여 버튼이 클릭되었을 때 실행할 메서드를 지정합니다. button.OnClick()이 호출되면 Click 이벤트에 연결된 ButtonClicked 메서드가 실행됩니다.
델리게이트의 특징
메서드 참조
델리게이트는 메서드의 참조를 저장할 수 있습니다. 메서드를 변수처럼 다룰 수 있기 때문에 동적으로 메서드를 호출할 수 있습니다.
타입 안전성
델리게이트는 참조할 수 있는 메서드의 시그니처(매개변수와 반환 타입)를 미리 정의하므로, 타입 안전성을 보장합니다.
정리
델리게이트는 메서드를 참조하는 객체로, 메서드를 동적으로 호출하거나 콜백을 구현하는 데 사용됩니다.
멀티캐스트 델리게이트를 통해 여러 메서드를 한 번에 호출할 수 있습니다.
이벤트는 델리게이트를 활용하여 특정 상황에서 메서드를 호출하도록 만드는 메커니즘입니다.
델리게이트는 코드의 유연성을 높이고, 특히 이벤트 기반 프로그래밍에서 중요한 역할을 합니다. 이해하고 나면 메서드 호출을 더 유연하게 처리할 수 있는 강력한 도구임을 알 수 있을 것입니다.