Unity&C#/C#

[C#] Delegate, Event, Action 그리고 Func

리네엔 2024. 10. 14. 22:47

1. Delegate

  • What is Delegate?
    • Delegate는 C#에서 메서드 참조를 가능하게 하는 형식.
    • 메서드의 서명(매개변수와 반환 타입)을 기반으로 메서드를 가리킬 수 있으며, 마치 함수 포인터처럼 동작.

예시

public delegate void MyDelegate(string message);  // 리턴 타입이 void인 Delegate 정의

public void PrintMessage(string message)
{
    Console.WriteLine(message);
}

MyDelegate del = PrintMessage;  // 메서드 참조
del("Hello, Delegate!");        // Delegate를 통한 메서드 호출

2. Event

  • What is Event?
    • 특수한 형태의 dlegate
    • 이벤트의 추가 및 제거만 가능 (=으로 할당 불가능)
    • 클래스 외부에서 이벤트 호출 불가
  • 왜 이걸 쓰지? private 과 public으로 그냥 대리자를 선언하는 것과 무엇이 다를까
    • private으로 선언 시 문제점 : 외부에서 완전히 접근이 막혀서 추가 불가능함
    • public으로 선언 시 문제점 : 외부에서 =으로 할당해버려서 다른 메서드들을 날려버릴 수 있음. 또한 캡슐화에도 위배됨
    • event로 선언하면 외부에서 메서드를 추가(구독)할 수는 있지만, =으로 할당해서 다른 메서드를 날려버리는 것을 방지할 수 있음. 또한 캡슐화를 유지할 수 있음.

2. Action

  • What is Action
    • Action은 C#에서 미리 정의된 Delegate로, 리턴 값이 없는 메서드를 참조할 때 사용.
    • 입력 매개변수를 최대 16개까지 가질 수 있으며, 따로 Delegate를 선언하지 않고 바로 사용할 수 있음.
    • 항상 반환 타입은 void.

예시

Action<string> action = (message) => Console.WriteLine(message);  // 리턴 타입이 void인 메서드 참조

action("Hello, Action!");  // Action을 통한 메서드 호출

3. Func

  • What is Func
    • Func는 C#에서 미리 정의된 Delegate로, 반환 값이 있는 메서드를 참조할 때 사용.
    • 최대 16개의 매개변수를 받을 수 있으며, 마지막 타입 인수는 반환 타입.
    • 반환 값을 필요로 하는 모든 메서드에 사용할 수 있으며, Delegate와 달리 미리 정의된 형태로 제공.

예시

Func<int, int, int> add = (x, y) => x + y;  // 두 개의 int를 받아 int를 반환하는 Func

int result = add(5, 10);  // Func 호출
Console.WriteLine(result);  // 출력: 15

차이점 정리

구분 Delegate Action Func
정의 메서드를 참조할 수 있는 사용자가 정의한 형식 리턴 값이 없는 메서드를 참조할 수 있는 미리 정의된 Delegate 리턴 값이 있는 메서드를 참조할 수 있는 미리 정의된 Delegate
리턴 타입 사용자 정의 void 사용자 정의 (마지막 타입 인수가 반환 타입을 의미)
매개변수 사용자 정의 최대 16개의 매개변수 최대 16개의 매개변수
사용 편의성 사용자가 직접 Delegate를 정의해야 함 미리 정의된 형식으로 간단하게 사용 가능 미리 정의된 형식으로 간단하게 사용 가능

'Unity&C# > C#' 카테고리의 다른 글

[C#] String Builder  (0) 2024.10.14
[C#] 클래스 상속, 추상클래스, 인터페이스  (0) 2024.10.14
[C#] Console  (1) 2024.10.14
[C#] Operator Precedence  (0) 2024.10.14
[C#] Literal  (0) 2024.10.14