본문 바로가기
C#

delegate 를 더 간결하게 선언하는 방법

by Oz Driver 2025. 4. 23.

 

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이기 때문에 변수 선언과 할당만으로도 바로 사용할 수 있습니다.

따라서 간단한 콜백이나 조건 함수 등을 구성할 때는 이런 미리 정의된 형식을 사용하는 것이 훨씬 효율적입니다.