NGMsoftware

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

    학습


    C# 29-1. C#의 event. (이벤트)

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 이전 델리게이트에 이어서 이벤트에 대해 알아보도록 하겠습니다. 보통 대부분의 응용 프로그램에서 이벤트는 UI(User Interface)를 가지는 컨트롤 또는 모듈이 발생 시키는 어떤 사건을 말합니다. 이 이벤트에 따라 사용자(Client)는 다양한 처리를 할 수 있습니다. 다시 말하면 어떤 사용자(Customer)의 요청에 따라 상태 변화를 감지하여 Client 개발자가 처리할 수 있다는 의미입니다.

    vwvbvcl.jpg

     

     

    이벤트는 콜센터를 생각하면 쉽게 이해할 수 있습니다. 지금 최순실, 박근혜 게이트를 예로 들어볼까요? 재벌들이 최순실에게 자신들의 고충을 토로합니다. 최순실은 콜센터 회사역할이고, 박근혜가 고객 만족을 실천하는 콜센터 직원인 셈이죠. 이렇게 최순실은 고객(재벌)들의 상태를 감시하다가 의뢰가 들어오면 박근혜에게 위임하게 됩니다. 이 때 박근혜는 의뢰 내용에 따라 환경부, 노동부, 검찰, 기획재정부등등... 관련 부처에 할당하고 재벌의 요구를 처리해줍니다.

     

    그럼 위의 내용을 토대로 간단한 이벤트 예제를 만들어 보도록 하겠습니다. 별도의 UI 이벤트를 받기 위해 Windows Forms 응용 프로그램을 추가하세요. 만약, 콘솔 응용 프로그램으로 만든다면 이벤트를 강제로 발생시키기 위한 별도의 메소드를 추가해야 합니다. 코드가 간단하긴 하지만, 시나리오를 이해하기에는 윈도우 폼으로 만드는게 좋을거 같네요. 프로젝트가 생성되었으면, 기본 Form1.cs의 이름을 박근혜.cs로 변경하세요. 그리고 최순실.cs 클래스를 하나 추가합니다.

    최순실.cs

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public class 최순실 : Button
        {
            public delegate void 부정부패의뢰(object sender, EventArgs e); 
            
            public event 부정부패의뢰 청탁하기;
    
            public 최순실()
            {
                // 버튼을 상속받고 있으므로 이미 정의되어 있는 이벤트를 연결하여 처리.            
                this.MouseClick += 최순실_MouseClick;
            }
    
            private void 최순실_MouseClick(object sender, MouseEventArgs e)
            {
                // 이 이벤트를 구독하고 있는 사용자가 있는지 확인.            
                if (this.청탁하기 != null)
                {
                    // 구독자가 위임하고 있는 메소드 호출.
                    청탁하기(this, EventArgs.Empty);
                }
            }
        }
    }

     

     

    간단하게 만들기 위해 Button을 상속 받습니다. 만약, 어떤 컨트롤 또는 모듈을 만들려면 CustomControl(사용자 지정 컨트롤)과 UserControl(사용자 정의 컨트롤)중 하나를 선택해서 만들면 됩니다. 이 홈페이지에 컨트롤 만들기 관련 글이 여러개 있긴한데요. 대부분 기존 컨트롤을 상속 받아서 처리하는 내용입니다. 언제 시간내서 CustomControl에 대한 내용도 다시한번 정리해야 겠네요. 예전에 블로그에 썼던 내용들이 다 사라져서...

     

    이제 박근혜 폼을 아래와 같이 디자인하세요. 폼의 디자인은 단순한데요. 주의할 점은 위에서 만든 최순실 버튼을 추가해야 한다는 것입니다.

    Y6XXBcM.png

     

     

    F7을 눌러서 코드 보기로 이동하세요.

    박근혜.cs

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class 박근혜 : Form
        {
            public 박근혜()
            {
                InitializeComponent();
    
                this.최순실1.청탁하기 += 최순실1_청탁하기;
            }
    
            private void 최순실1_청탁하기(object sender, EventArgs e)
            {
                MessageBox.Show(this, 
                    "처리가 완료 되었습니다. 빨리 입금 해주세요~", 
                    "Information", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Information);
            }
        }
    }

     

     

    12라인에서 이벤트 핸들러에 이벤트 처리기를 할당 또는 매핑합니다. delegate는 기본적으로 Multicast Delegate에서 파생됩니다. 따라서, + 연산자를 사용해서 대리자 인스턴스에 여러개의 핸들러를 등록할 수 있습니다. 물론, -연산자를 이용해서 삭제도 가능합니다.

     

    재벌들이 UI를 통해 청탁할 내용을 입력한 후 최순실을 호출(Click)합니다. 그러면, 최순실은 청탁 내용을 보고 박근혜에게 알리게 되죠. 이 샘플 코드는 단순해서 청탁 내용에 따라 박근혜가 처리하는 로직은 없습니다. 모두 동일하게 처리가 되어지고 있죠. 그렇다면 좀 더 복잡하게 코드를 변경하고 일반적으로 이벤트를 사용하는 방식으로 변경 해볼께요.

    최순실.cs

    using System;
    
    public enum 청탁구분 { 노동법, 세금법, 상속법 }
    public class 부정부패청탁정보 : EventArgs
    {
        public 청탁구분 Category { get; private set; }
    
        public string Text { get; private set; }
    
        public 부정부패청탁정보(청탁구분 category, string text)
        {
            Category = category; 
            Text = text;
        }
    }

     

     

    위와 같이 이벤트 핸들러를 통해 상태를 전달할 EventArgs(부정부패청탁정보)를 추가합니다. 좀 더 많은 정보를 전달하기 위해 카테고리와 내용으로 구분했습니다. 이제 재벌로부터 의뢰받은 내용을 최순실이 적절히 구분해서 박근혜에게 오더를 내리게 됩니다. 생각 없이 만들다보니 좀 이상하게 되긴 했지만, TextBox를 제거하고 최순실 버튼을 클릭할 때 ConfirmBox로 데이타를 받아서 처리하는게 어떨까하는 생각이 갑자기 드네요-_-; 아무튼, 최순실을 호출(Click)하면 의뢰 입력창이 나타난다고 생각하고 아래 코드를 봐주세요. 의뢰 받은 내용을 입력 받는 부분이 42라인입니다.

    최순실.cs

    public class 최순실 : Button
    {
        public delegate void 부정부패의뢰(object sender, 부정부패청탁정보 e);
        public event 부정부패의뢰 청탁하기; public 최순실()
        {
            // 버튼을 상속받고 있으므로 이미 정의되어 있는 이벤트를 연결하여 처리.            
            this.MouseClick += 최순실_MouseClick;
        }
        private void 최순실_MouseClick(object sender, MouseEventArgs e)
        {
            // 이 이벤트를 구독하고 있는 사용자가 있는지 확인.            
            if (this.청탁하기 != null)
            {
                // 구독자가 위임하고 있는 메소드 호출.                
                청탁하기(this, new 부정부패청탁정보(청탁구분.노동법, "노동자들 임금을 삭감할 수 있게 도와주세요."));
            }
        }
    }

     

     

    박근혜는 최순실로부터 받은 의뢰 내용을 분류하여 적절히 처리하게 됩니다.

    박근혜.cs

    using System;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class 박근혜 : Form
        {
            public 박근혜()
            {
                InitializeComponent(); 
                
                this.최순실1.청탁하기 += 최순실1_청탁하기;
            }
    
            private void 최순실1_청탁하기(object sender, 부정부패청탁정보 e)
            {
                string 처리부서 = string.Empty; switch (e.Category)
                {
                    case 청탁구분.노동법: 처리부서 = "고용노동부"; break;
                    case 청탁구분.상속법: 처리부서 = "국세청"; break;
                    case 청탁구분.세금법: 처리부서 = "안전기획부"; break;
                    default: 처리부서 = "박근혜"; break;
                }
    
                MessageBox.Show(this, 
                    $"{처리부서}가 처리를 완료 하였습니다. 빨리 입금 해주세요~", 
                    "Information", 
                    MessageBoxButtons.OK, 
                    MessageBoxIcon.Information);
            }
        }
    }

     

     

    뭐 이런식입니다. 사실 정치에 별 관심이 없는 개발자 또는 공부하고 있는 사람이라면 이 내용이 더 어려울겁니다. 그리고, 일반적으로 볼 수 있는 네이밍룰도 아니기 때문에 혼란만 가중될지도 모르죠. 많은 곳에서 발행자(Publisher)와 구독자(Subscriber)로 설명합니다. 이 내용도 발행자(최순실)가 이벤트를 외부로 노출하고, 이를 구독자(박근혜)가 모니터링하는 방식입니다. 물론, 박근혜가 해외 순방이라던가 사고 또는 병가등등으로 직무를 수행할 수 없을 때 황교안이 대신 구독하고 처리할수도 있습니다. 둘다 구독할수도 있고요.

    6gxj0NY.jpg

     

     

    다음에는 UserControl(사용자 정의 컨트롤)을 이용해서 좀 더 일반적인 예제를 가지고 한번 더 이벤트에 대해 글을 쓰겠습니다.

    다음 시간에...

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

    댓글목록

    등록된 댓글이 없습니다.