C#/C# 교과서

[C# 교과서] 40~41. 대리자, 이벤트

서니션 2023. 1. 18. 14:25
728x90
반응형

대리자(위임/델리게이트)

  • 대리자(delegate)는 매개변수 목록 및 반환 형식이 있는 메서드 참조(포인터)를 나타내는 형식
  • 대리자는 함수 자체를 데이터 하나로 보고 의미 그대로 다른 메서드를 대신 실행하는 기능
  • 한 번에 메서드 하나 이상을 대신해서 호출
  • 내부적으로 MulticastDelegate 클래스에서 기능을 상속
using System;

class DelegateDemo
{
    // 함수 생성 -> 매개변수도 없고 반환값도 없는 함수
    static void Hi() => Console.WriteLine("Hi");

    // 대리자 생성 -> 매개변수도 없고 반환값도 없는 함수를 대신 실행할 대리자
    delegate void SayDelegate();

    static void Main()
    {
        // Hi 함수를 say 이름으로 대신해서 호출
        SayDelegate say = Hi;
        say();

        // Hi 함수를 hi 이름으로 대신해서 호출 : 또 다른 모양
        var hi = new SayDelegate(Hi);
        hi();
    }
}

대리자에는 += 연산자를 사용하여 대신할 메서드를 하나 이상 등록 가능

💡 대리자 변수 += new 대리자(메서드이름);

메서드이름에 함수를 넣어 ‘함수 포인터’로 사용 가능


함수 포인터

> public delegate void Whats(); // 함수 포인터 형식
// 함수 포인터 정의
> Whats whats = delegate { Console.WriteLine("함수 포인터 == 대리자"); };
> whats(); // 함수포인터 호출
함수 포인터 == 대리자 // 결과

Action, Func, Predicate 대리자

  • Action 대리자 : 반환값이 없는 메서드를 대신 호출
  • Func 대리자 : 매개변수와 반환값이 있는 메서드를 대신 호출
  • Predicate 대리자 : T 매개변수에 대한 bool 값을 반환하는 메서드를 대신 호출

이벤트

특정 상황이 발생할 때 개체 또는 클래스에서 알림을 제공할 수 있도록 하는 멤버

이벤트는 사건 및 사고 의미를 갖지만 프로그래밍에서는 특정 메서드가 실행되는 결과라는 의미가 큼

using System;

public class ButtonClass
{
    // 이벤트 생성을 위한 대리자 하나 생성
    public delegate void EventHandler(); // 메서드를 여러 개 호출 가능

    // 이벤트 선언 : Click 이벤트
    public event EventHandler Click;

    // 이벤트 발생 메서드 : OnClick 이벤트 처리기(핸들러) 생성
    public void OnClick()
    {
        if (Click != null) // 이벤트에 등록된 값이 있는지 확인(생략 가능)
        {
            Click(); // 대리자 형식의 이벤트 수행
        }
    }
}

class EventDemo
{
    static void Main()
    {
        // Button 클래스의 인스턴스생성
        ButtonClass btn = new ButtonClass();

        // btn 개체의 Click 이벤트에 실행할 메서드들 등록
        btn.Click += Hi1;
        btn.Click += Hi2;

        // 이벤트 처리기(발생 메서드)를 사용한 이벤트 발생: 다중 메서드 호출
        btn.OnClick();
    }
    static void Hi1() => Console.WriteLine("C#");
    static void Hi2() => Console.WriteLine(".NET");
}
728x90
반응형