본문 바로가기
컴퓨터 공학/C, C++

[C# 실습 예제] 비주얼 스튜디오2019_ Delegate

by hahehohoo 2019. 11. 13.
반응형

■ 목적

- 함수의 대리자 (사전적인 의미: Delegate '대리자')

- method 동일한 Type의 delagate를 선언

- 선언한 delegate 변수 생성

- 생성한 delegate에 사용할 method를 참조 시킴

- CallBack method 구현 : method의 인자로 delegate를 사용하여 다른 함수에서 delegate 함수를 호출해서 사용하도록 함

- 델리게이트의 일반화 (delegate<T>): 일반화 Type으로 선언 할 경우 어떤 Type의 method 든지 사용할 수 있음

- 델리게이트 체인(delegate chain) : - +=, -=로 함수를 연결하거나 해제해서 순서대로 호출할 수 있음 

 


> UI 만들고 naming 하기

- listbox 만드는 이유는 delegate 순서를 알기 위해

 

 

 

 

 

 

 

 

 

 

 

 

함수 작성해서 "주문하기" 버튼 기능 추가하기

public partial class Form1 : Form
    {
        int _iTotalPrice = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnOrder_Click(object sender, EventArgs e)
        {
            if (rdoDow1.Checked)
            {
                fDov(1);
            }
            else if (rdoDow2.Checked)
            {
                fDov(2);
            }

            #region Function

            //0:선택 안함 1:오리지널, 2:씬
            private int fDov(int iOder)
            {
                string strOrder = string.Empty;
                int iPrice = 0;

                if (iOder == 1)//로그 남길 것 여기다 코드 적을 것 
                {
                    iPrice = 10000;
                    strOrder = string.Format("도우는 오리지널을 선택하셨습니다.({0}원)", iPrice.ToString());
                }
                else if (iOder == 2)
                {
                    iPrice = 11000;
                    strOrder = string.Format("도우는 씬을 선택하셨습니다.({0}원)", iPrice.ToString());
                }
                else
                {
                    strOrder = "도우를 선택하지 않았습니다. ";
                }

                lboxOrder.Items.Add(strOrder);

                return _iTotalPrice = _iTotalPrice * iPrice;
            }

            #endregion
        }
    }

이렇게 로그를 찍어도 되지만 이제 Delegate기능을 활용해서 만들어 보자. 

 

 

> delegate 선언하기

반환 형, 인자 값 타입 형 같아야함 여기서는 int

 

> 버튼을 클릭했을 때 이벤트에 delegate 활용하기

변수명은 delDow, new라는 키워드를 사용하는데 인자값을 (int(int)target)으로 받아야 한다고 알려준다. 이미 만들어 놓은 fDow로 타겟으로 잡아두자. 

 

 

 

 

 

public partial class Form1 : Form
    {
        public delegate int delFuncDow_Edge(int i);
        //delegate 선언, 형이랑 반환형태, 인자 값(int) 모두 같게 해주자. 

        int _iTotalPrice = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnOrder_Click(object sender, EventArgs e)
        {
            delFuncDow_Edge delDow = new delFuncDow_Edge(fDow);
            delFuncDow_Edge delEdge = new delFuncDow_Edge(fEdge);


            int iDowOrder = 0;
            int iEdgeOrder = 0;

            //Dow 호출
            if (rdoDow1.Checked)
            {
                iDowOrder = 1;
            }
            else if (rdoDow2.Checked)
            {
                iDowOrder = 2;
            }
            delDow(iDowOrder);

            //Edge를 선택
            if (rdoEdge1.Checked)
            {
                iEdgeOrder = 1;
            }
            else if (rdoEdge2.Checked)
            {
                iEdgeOrder = 2;
            }
            delEdge(iEdgeOrder);
        }

        private int fEdge(int iOder)
        {
            string strOrder = string.Empty;
            int iPrice = 0;

            if (iOder == 1)//로그 남길 것 여기다 코드 적을 것 
            {
                iPrice = 1000;
                strOrder = string.Format("엣지는 리치골드을 선택하셨습니다.({0}원)", iPrice.ToString());
            }
            else if (iOder == 2)
            {
                iPrice = 2000;
                strOrder = string.Format("엣지는 치즈크러스트을 선택하셨습니다.({0}원)", iPrice.ToString());
            }
            else
            {
                strOrder = "엣지를 선택하지 않았습니다. ";
            }

            lboxOrder.Items.Add(strOrder);

            return _iTotalPrice = _iTotalPrice + iPrice;
        }

        private int fDow(int iOder)
        {
            string strOrder = string.Empty;
            int iPrice = 0;

            if (iOder == 1)//로그 남길 것 여기다 코드 적을 것 
            {
                iPrice = 10000;
                strOrder = string.Format("도우는 오리지널을 선택하셨습니다.({0}원)", iPrice.ToString());
            }
            else if (iOder == 2)
            {
                iPrice = 11000;
                strOrder = string.Format("도우는 씬을 선택하셨습니다.({0}원)", iPrice.ToString());
            }
            else
            {
                strOrder = "도우를 선택하지 않았습니다. ";
            }

            lboxOrder.Items.Add(strOrder);

            return _iTotalPrice = _iTotalPrice + iPrice;
        }
    }

 

"주문하기" 버튼을 누르면 
delegate로 넘어가고 함수가 불러진다. 

반응형


댓글