C# 에서 delegate는 함수 자체를 변수처럼 다룰 수 있게 해주는 기능입니다. 이 덕분에 함수 호출을 동적으로 구성할 수 있고, 이벤트나 콜백 처리에 자주 사용됩니다.
하지만 직접 delegate 형식을 정의해서 사용하는 방식은 코드가 길어지고 구조가 복잡해 보일 수 있습니다.
전통적인 delegate 방식
// delegate 형식 정의
private delegate void StateCallback();
// delegate 변수 선언
private StateCallback onStart;
private StateCallback onUpdate;
private StateCallback onComplete;
// 함수 할당
onStart = () => Debug.Log("시작");
onUpdate = () => Debug.Log("진행 중");
onComplete = () => Debug.Log("완료");
보시는 것처럼, delegate를 사용하려면 형식을 먼저 정의하고, 변수 선언을 따로 하고, 그 변수에 함수를 할당해야 하는 구조로 되어 있어 코드가 다소 길어집니다.
Action 으로 대체했을 때
// 별도 형식 선언 없이 바로 사용
private Action onStart;
private Action onUpdate;
private Action onComplete;
onStart = () => Debug.Log("시작");
onUpdate = () => Debug.Log("진행 중");
onComplete = () => Debug.Log("완료");
Action은 이미 delegate void()와 동일한 형식으로 정의된 타입입니다. 즉, 형식 선언이 생략된 delegate라고 보면 됩니다. 코드의 흐름이 단순해지고, 선언부가 줄어들면서 가독성도 좋아지는 장점이 있습니다.
간결한 delegate를 위한 미리 정의된 형식들
C#에서는 자주 쓰이는 패턴들을 위해 Action, Func, Predicate 같은 미리 정의된 delegate 형식을 제공합니다.
이들을 잘 활용하면 코드를 훨씬 간단하게 만들 수 있습니다.
Action
* 반환값이 없는 함수
* 파라미터만 있고 void를 반환할 때 사용
* 예 : Action 은 void 함수(string arg) 와 같습니다.
Func
* 값을 반환하는 함수
* 마지막 제네릭 매개변수가 반환 타입입니다.
* 예 : Func<int, int, int> 는 int 함수(int, int) 와 같습니다.
Predicate
* bool을 반환하는 함수
* 조건 판단, 필터링 등에 자주 사용됩니다.
* 예 : Predicate 은 bool 함수(string arg) 와 같습니다.
마무리
delegate 는 형식을 선언하고, 그 형식을 이용해 변수를 선언하고, 거기에 함수를 할당해야 합니다.
반면 Action, Func, Predicate 는 형식 선언이 생략된 delegate이기 때문에 변수 선언과 할당만으로도 바로 사용할 수 있습니다.
따라서 간단한 콜백이나 조건 함수 등을 구성할 때는 이런 미리 정의된 형식을 사용하는 것이 훨씬 효율적입니다.
'C#' 카테고리의 다른 글
Enum을 활용한 Dictionary 이해하기 (0) | 2025.04.28 |
---|---|
대리자를 이용한 FSM 만들기 (0) | 2025.04.24 |
bool isValue = (조건식) : 삼항 연산자를 보다 단순하게 (0) | 2025.04.22 |
구조체를 배열로 만들면 메모리 저장 위치는 어디일까? (0) | 2025.04.22 |
int.TryParse() 와 Convert.ToInt32() 중 어떤 걸 써야하나? 고민된다면 (0) | 2025.04.02 |