개요

컴퓨터의 사건에 반응하는 프로그램을 만드는 방법

* 컴퓨터의 사건(이벤트) : 키 입력, 파일의 복사 등..

 

 


대리자

대리자는 누군가를 대신해서 일해주는 것으로 C#에서 Callback을 맡아 실행하는 일을 대리자가 담당한다.

 

대리자는 메소드(함수)에 대한 참조로 메소드의 주소를 할당한 후 대리자를 호출하면 대리자가 메소드를 호출한다.

 

[한정자] delegate [함수의 모양]

public delegate int MyDeligate(int a, int b);

public MyDeligate myDeligate;
// int (int,int) 모양의 함수를 받을 수 있는 myDeligate 대리자 객체를 만들었다.

MyDeligate는 int, string과 같은 타입 형식이며,

인스턴스를 생성하여 메소드(함수)를 참조하는 객체를 생성할 수 있다.

 

 

using System;

namespace Delegate
{
    delegate int MyDelegate(int a, int b);
    class Calculator
    {
        public int Plus(int a, int b)
        {
            return a + b;
        }
        public static int Minus(int a, int b)
        {
            return a - b;
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            Calculator Calc = new Calculator();
            MyDelegate Callback;

            Callback = new MyDelegate(Calc.Plus);
            Console.WriteLine(Callback(3, 4));

            Callback = new MyDelegate(Calculator.Minus);
            Console.WriteLine(Callback(7, 5));
        }
    }
}

대리자는 값이 아닌 코드(메소드)를 매개변수로 넘기고 싶을 때 사용할 수 있다.

 

 

일반화 대리자

탬플릿을 활용하여 일반화 대리자를 만들 수 있다.

delegate int Compare<T>(T a , T b);

 

 

대리자 체인

대리자는 여러 메소드(함수)를 참조할 수 있다.

// 이 부분 코드와 이미지로 표현 필요

 

익명 메소드

접근자, 이름이 없는 메소드

 

대리자와 이벤트

이벤트는 클래스 외부에서 직접 사용할 수 없다는 특징이 있다.

이벤트를 사용하여 견고한 프로그래밍을 기대할 수 있다.

 

 

Action / Func

Action과 Func는 .NET에서 미리 만들어 놓은 대리자이다.

 

Action<T> 대리자 (System)

매개 변수가 하나이고 값을 반환하지 않는 메서드를 캡슐화합니다.

docs.microsoft.com

 

 

Func<TResult> 대리자 (System)

매개 변수가 없고 TResult 매개 변수에 지정된 형식의 값을 반환하는 메서드를 캡슐화합니다.

docs.microsoft.com

Action과 Func의 차이는 반환 타입의 유무이다.

 

public delegate void Action<in T>(T arg);

public delegate TResult Func<in T, out TResult>(T arg);

 

 

Event

[한정자] event [delegate 타입] [객체이름];

public event Action Onsomething; // Action타입의 OnSometing 객체가 만들어짐

옵저버 패턴을 쉽게 사용하기 위한 타입이다.

선언된 대리자 타입의 함수를 보관할 수 있다.

대리자와 다르게 외부에서 Invoke()를 할 수 없다.

함수가 중복되어 추가 된다면 디버깅이 어렵기 때문에 꼭 추가하기 전에는 삭제를 해준다.

이벤트 객체에 아무런 함수도 없는 경우에는 null이기 때문에 Invoke()를 호출할 때는 꼭 null체크를 해준다.

 

활용 방법은 'Event'의 의미대로 특정 사건 (혹은 시점)을 나타내며, 그 시점에서 일어나야 하는 일들(코드 상에서는 메소드로 표현)을 일어나게 할 수 있다.

 

주의 사항

(1) 특정 시점이 됐는데 Invoke() 호출이 누락된 경우

(2) Invoke()가 호출될 때 실행되어야 할 메소드가 추가되지 않은 경우

 

추가

대리자의 접근 한정자를 private으로 설정하면

evnet처럼 외부에서 Invoke()가 불가능하지만, 외부에서 데이터도 받아올 수 없는 차이가 있다.

* event도 접근 한정자를 private으로 하면 외부에서 받아올 수 없는 차이가 있다.

 

728x90

'Program > C (C++,C#)' 카테고리의 다른 글

추상 클래스 vs 인터페이스  (0) 2023.02.07
[C#] Property  (0) 2022.08.16
[C#] 파일 다루기  (0) 2022.08.10
[C++] 해시 테이블  (0) 2022.07.06
[C++] 힙 (Heap)  (0) 2022.07.06

+ Recent posts