티스토리 뷰

프로그래밍/C#

대리자, 이벤트 처리기

에어버스 2022. 10. 18. 23:31

 

 

ConsoleApp1.zip
0.03MB

대리자, 이벤트 처리기

함수에 대한 참조를 저장하는 형식
함수의 선언과 비슷하지만 아래와 다른 점이다.
-함수 본문은 없다
- delegate 키워드 사용
(아래코드 3행)

delegate int processDelegate(double parma1, double param2);
키워드 : delegate
대리자 형식 이름 : processDelegate
반환 자료형 : int
인수자료형 : double, double


대리자 선언은 (아래코드 3행)
반환 형식과 매개변수 목록을 가진 하나의 함수(processDelegate) 서명을 지정한다. (가상함수나 함수 포인터와 비슷한가...)
서명 : 함수의 반환 자료형과 함수 매개변수(인수)의 자료형이 같은것 = 서명일치

대리자 선언해둔 후에는 그 대리자 형식의 변수(process)를 선언한다. (아래 코드 16행)

그 이후에는 대리자 선언과 동일한 서명을 가진 함수(Multiply)에 대한 참조를 그 변수(process)에 배정할 수 있다.
(아래코드 26, 28행)

대리자 변수에 함수의 참조가 배정되면 그 대리자 변수를 통해서 그 함수를 호출할 수 있다. (아래코드 29행)

변수로 함수를 참조하고 호출할 수 있다면, 대리자 변수를 다른 함수에 하나의 매개변수로 넘겨주고, 그 함수는 대리자가 가리키는 함수를 호출하는 것이 가능하다. 이는 다른 말로하면, 실제로 호출될 함수를 코드 자체에서가 아니라 실행 시점에서 결정 또는 변경할 수 있다는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
internal class Program
{
    delegate double processDelegate(double parma1, double param2); // 대리자 정의
 
    static double Multiply(double param1, double param2)
    {
        return param1 * param2;
    }
 
    static double Divide(double param1, double param2)
    {
        return param1 / param2;
    }
    static void Main(string[] args)
    {
       processDelegate process; // 대리자 형식의 변수
        Console.WriteLine("콤마로 구분하는 2개의 숫자를 입력하세요 : ");
        string input = Console.ReadLine();
        int commaPos = input.IndexOf(',');
        double param1 = Convert.ToDouble(input.Substring(0, commaPos));
        double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
 
        Console.WriteLine("곱샘은 M, 나눗셈은 D : ");
        input = Console.ReadLine();
        if (input == "M")
            process = new processDelegate(Multiply); // 참조할 함수(Multiply) 배정        
else
            process = new processDelegate(Divide);
        Console.WriteLine("결과값 : {0}", process(param1, param2)); // if 조건에 따라 Multify() 또는 Divide() 가 호출된다.
 
        Console.ReadLine();
    }
}
cs

 

3행 : 두 함수(Multiply, Divide)와 일치하는 서명을 가진 하나의 데리자(processDelegate)를 정의한다.
delegate 키워드는 이 정의가 함수가 아니라 대리자의 정의임을 의미한다.
그 다음은 double 형식의 반환값과 두 개의 double 형식의 매개변수를 지정하는 함수 서명이다. 그 사이의 함수 이름은 사실 실제로 호출될 함수 이름이 아니라 대리자 형식의 이름으로, 이름에 대한 규칙은 일반 변수나 함수 이름짓기와 동일하다. 이 코드에서는 대리자 이름을 processDelegate, 그리고 두 개의 double 매갭변수들은 각각 param1, param2 라 했다.

16행 : Main() 은 새 대리자 형식을 사용하는 변수를 하나 선언한다.

26, 28행 : 사용자의 선택에 기반해서 대리자 변수에 적절한 함수 참조를 배정한다.
대리자 변수에 함수 참조를 배정할 때에는 new 연산자를 사용한다. new 다음에는 대리자 형식을 써주고, 괄호 안에 매개면수로서 실제 함수 이름을 넣는다. 이때 함수 서명이나 괄호를 뺀 순수한 함수 이름만 지정하는 점을 기억해야 한다.

29행 : 선택된 함수를 대리자를 이용해서 호출한다. 대리자를 통한 호출은 대리자가 어떤 함수를 참조하고 있는지에 상관없이 동일한 구문을 사용한다.


대리자 변수를 마치 함수 이름처럼 사용한다. 그러나 대리자는 변수이므로 다음처럼 다른 함수의 매개변수로써 전달 할 수 있다. 아래 코드 참조.

1
2
3
4
static void executeFunction(processDelegate process)
{
    process(2.33.3);
}
cs

이는 대리자를 함수에 전달함으로써 함수의 행동 방식을 제어할 수 있음을 의미한다. 예를 들어서  string 배열을 정렬하는 함수가 있다고 하고 성능을 위해서 배열의 특징에 따라 몇 가지 정렬 알고리즘들 중 하나를 선택한다고 하면 조건에 따라 특정 알고리즘 함수를 대리자에 배정하고 그 대리자를 정렬 함수에 전달하면 될 것이다.

그 외에도 대리자의 용도는 무궁무진하나, 가장 주된 용도는 이벤트 처리일 것이다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28