C#에서는 메서드를 참조하고 호출하는 다양한 방식이 존재합니다.
그중에서도 delegate, Action, 그리고 event는 자주 사용되는 대표적인 기능들입니다.
이 세 가지를 한 번에 비교하여 각 개념의 역할과 사용 방법을 이해해봅시다.
사실 이 3가지를 비교한다는 말은 좀 어거지다.
다만, 처음보면 다소 헤깔리기 때문에 같이 놓고 어떤 식으로 쓰이는지 알아보는 정도로 이해하면 좋겠다.
Delegate
정의:
delegate는 특정 메서드를 참조할 수 있는 사용자 정의 타입으로, C++의 함수 포인터와 유사한 기능을 제공합니다. 여러 메서드를 한 번에 호출하거나, 메서드를 콜백 형태로 전달할 때 유용합니다.
사용 방법:
직접 특정 시그니처를 정의하여, 그와 같은 매개변수와 리턴 타입을 가진 메서드를 참조할 수 있습니다.
public delegate void PrintDelegate(string message);
void Example()
{
PrintDelegate print = PrintMessage;
print("Hello World");
}
void PrintMessage(string message)
{
Debug.Log(message);
}
특징:
직접 정의해야 하며, 메서드의 매개변수와 반환형을 커스텀하게 설정할 수 있습니다.
Action
정의:
Action은 C#에서 미리 정의된 제네릭 delegate 타입입니다.
리턴값이 없고 여러 개의 매개변수를 받을 수 있는 메서드를 참조하는 데 사용됩니다.
사용 방법:
delegate를 정의할 필요 없이 더 간단하게 콜백을 사용할 수 있습니다.
void Example()
{
Action<string> print = PrintMessage;
print("Hello World");
}
void PrintMessage(string message)
{
Debug.Log(message);
}
특징:
코드의 간결성을 높여줍니다. 특히 리턴값이 없는 단순한 콜백을 다루는 경우 delegate를 직접 정의하는 대신 Action을 사용하면 훨씬 간편합니다. 또한, 다양한 매개변수를 받을 수 있는 제네릭 타입으로 최대 16개의 매개변수를 지원합니다.
Event
정의:
event는 delegate의 래퍼로서, 특정 상태 변화나 이벤트 발생 시 이를 다른 객체에 알리기 위해 사용됩니다. 이벤트는 외부에서 직접 호출할 수 없고, 등록(+=) 및 제거(-=)만 가능합니다.
사용 방법:
일반적으로 delegate 또는 Action을 event로 선언하여 외부에서 안전하게 관리할 수 있습니다.
특징:
event는 delegate나 Action을 외부에서 직접 호출하지 못하게 하여 잘못된 호출을 방지하고, 이벤트를 안전하게 관리할 수 있도록 해줍니다. 이벤트는 주로 객체의 상태 변화나 사용자 인터랙션과 같은 시나리오에서 사용됩니다.
차이점 요약
Delegate:
특정 시그니처를 가진 메서드를 참조할 수 있는 사용자 정의 타입입니다. 콜백 함수를 전달할 때 주로 사용되며, 여러 메서드를 순서대로 호출할 수 있습니다.
Action:
미리 정의된 제네릭 delegate 타입으로, 리턴값이 없는 메서드를 간단히 참조하는 데 사용됩니다. Delegate보다 간결하고 사용하기 쉬운 점이 장점입니다.
Event:
delegate나 Action을 안전하게 관리하기 위한 래퍼로, 외부에서 이벤트를 직접 호출하지 못하게 하고 등록 및 제거만 가능하도록 제한합니다. 주로 상태 변화나 이벤트 알림을 위한 용도로 사용됩니다.
언제 무엇을 사용할까?
Delegate는 커스텀한 형태의 메서드 참조가 필요하거나, 복잡한 매개변수 구성이 필요한 경우에 사용됩니다.
Action은 리턴값이 없고 간단하게 콜백 함수를 전달할 때 사용하기 적합합니다. 코드의 가독성을 높이고 간결하게 유지할 수 있습니다.
Event는 상태 변화나 특정 액션을 여러 곳에 알리고 싶을 때, 안전하게 delegate를 관리하고 외부에서 직접 호출할 수 없도록 하기 위해 사용됩니다.
이렇게 각 개념의 역할과 특징을 이해하면, 상황에 따라 적절한 기능을 선택하여 C# 코드를 더 효율적으로 작성할 수 있습니다.
'프로그래밍 > C#' 카테고리의 다른 글
싱글톤 (Singleton) (1) | 2024.10.14 |
---|---|
static 선언 (0) | 2024.10.13 |
Action (0) | 2024.10.12 |
Callback (1) | 2024.10.12 |
event 와 delegate (0) | 2024.10.12 |