NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 30. Delegate Chain (델리게이트 채인)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. FuncAction을 알아보기에 앞서 델리게이트 채인에 대해 알아보도록 하겠습니다. 이전 이벤트와 이어서 보면 좀 더 쉽게 이해할 수 있을지도 모릅니다-_-;

    우선 아래 그림처럼 간단한 계산기 폼을 하나 생성하세요.

    Y04XZMA.png

     

     

    UI는 상당히 심플한데요. 각 버튼을 더블 클릭해서 이벤트 처리기를 미리 추가하세요. 계산기를 만들 때 각각의 Operation에 대해 메소드를 만들고, 결과를 저장하면서 처리해도 됩니다. 하지만, 이렇게 만들 때 문제는 x + y 순서로 진행될 때 + 버튼이 클릭되는 시점에 y값을 알 수 없기 때문에 연산을 할 수 없게 됩니다. 그래서 x + y 를 처리하려면 = 버튼에서 처리해야 하죠. 만약, x + y + x + y처럼 연속해서 연산을 해야 한다면 각 오퍼레이션마다 = 버튼을 호출 해줘야 합니다. 그래서, 각각의 연산을 처리하는 메소드를 델리게이트 채인을 통해 한번에 처리하도록 해줘야 합니다.

    Form1.cs

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private List<int> values = new List<int>();
     
            public delegate int CalculatorDelegate(int a, int b);
            public CalculatorDelegate calculator;

     

     

     

    라인 9에 있는 values는 사용자가 입력한 값들을 저장하는 컬렉션입니다. 이 컬렉션이 필요한 이유는 각각의 오퍼레이션이 발생할 때마다 사용자가 입력한 값을 저장하기 위함입니다. 라인 11에서 델리게이트를 선언하고, 라인 12에서 변수에 할당합니다. 이제 이 대리자를 통해 위임할 메소드를 추가하세요.

    Form1.cs

    public int Plus(int a, int b) { return a + b; }
    public int Minus(int a, int b) { return a - b; }

     

     

    오퍼레이션(더하기나 빼기)이 발생할 때 사용자가 입력한 값을 저장하기 위한 메소드를 아래처럼 추가합니다.

    Form1.cs

    private void OperateInit()
    {
        values.Add(int.Parse(txtValue.Text));
        txtValue.Text = string.Empty;
        txtValue.Focus();
    }
    

     

     

    더하기와 빼기 버튼의 이벤트 처리기에서 적절한 메소드를 위임해줍니다.

    Form.cs

    private void btnPlus_Click(object sender, EventArgs e)
    {
        OperateInit();
        calculator += Plus;
    }
     
    private void btnMinus_Click(object sender, EventArgs e)
    {
        OperateInit();
        calculator += Minus;
    }
    

     

     

    = 버튼의 이벤트 처리기를 아래와 같이 코딩합니다.

    Form.cs

    private void btnResult_Click(object sender, EventArgs e)
    {
        values.Add(int.Parse(txtValue.Text));
     
        int index = 0;
        int result = values[index];
     
        foreach (CalculatorDelegate cal in calculator.GetInvocationList())
        {
            result = cal(result, values[++index]);
        }
     
        txtValue.Text = result.ToString("n0");
    }
    

     

     

    가각의 오퍼레이션에서 추가해준 메소드들을 순차적으로 처리해주는 로직을 담고 있습니다. Multicast Delegate의 모든 메소드가 처리되면 결과값을 txtValue에 표시합니다.

    마지막으로, Clear 버튼에 대한 내용도 처리 해주세요.

    Form.cs

    private void btnClear_Click(object sender, EventArgs e)
    {
        values.Clear();
        calculator = null;
        txtValue.Text = string.Empty;
    }
    

     

     

    4라인은 위임된 모든 메소드를 제거하기 위한 방법입니다. 만약, 특정 메소드만 제거해야 한다면 위임할 때와 반대로 -= 연산자를 사용하면 됩니다. 보통 연속된 변수를 분석하기 위한 모델을 선택적으로 사용해야 할 때 유용합니다. 또한, 이 모델이 스텝별로 다른 회귀 분석 방법을 택해야 한다면 델리게이트를 이용하는게 좋겠죠. 여기에서 알아보지는 않았지만, 델리게이트도 파라메터로 넘겨서 처리할 수 있습니다.

     

    업무 자동화 RPA 매크로 제작 및 견젹 문의 ]

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.