외로운 Nova의 작업실

c# 언어 공부 - 9(대리자와 이벤트) 본문

Programming/C#

c# 언어 공부 - 9(대리자와 이벤트)

Nova_ 2022. 5. 10. 01:49

 -안녕하세요. 오늘은 저번시간에이어 c# 언어에서 대리자와 이벤트에대해서 알아보겠습니다.

 

<대리자>

대리자는 쉽게말해서 비서같은역할을 합니다.

대리자에게 메소드들을 등록해놓으면 그 대리자는 메소드들을 실행시킵니다.

중요한점은 메소드'들' 이라는 점입니다.

대리자는 delegate 키워드로 선언이 됩니다.

먼저 코드부터 보시죠.

using System;

namespace StudyCSharp
{
    delegate void ThereIsFire(string location); //대리자 선언
    class MainApp
    {

        static void Main(string[] args)
        {
            
            
            void Call119(string location)
            {
                Console.WriteLine("소방서죠?" + location + "에 불이 났어요");
            }
            
            void ShoutOut(string location)
            {
                Console.WriteLine(location + "에 불이 났어요 도망치세요");
            }
            void Escape(string location)
            {
                Console.WriteLine(location + "에서 나갑시다.");
            }

            ThereIsFire Fire = new ThereIsFire(Call119);
            Fire += new ThereIsFire(ShoutOut);
            Fire += new ThereIsFire(Escape);

            Fire("서울특별시 성수동");
            

            

        }

       
        
    }
}

위 코드의 실행결과는 아래와 같습니다.

위 코드처럼 대리자는 하나의 메소드만 대리받을 수 있고, 아니면 여러개의 메소드를 대리받을 수 있습니다.

여러개의 메소드를 대리받게 만들때 대리자 체인을 만든다라고도 합니다.

+= 연산자로 추가할 수 있고,

-= 연산자로 체인을 끊을 수 도있습니다.

 

<익명메소드>

대리자에게 메소드를 그자리에서 직접 만들어서 줄 수도 있습니다.

코드부터 보시죠.

using System;

namespace StudyCSharp
{
    delegate int cal_sum(int a, int b); //대리자 선언
    class MainApp
    {

        static void Main(string[] args)
        {
             cal_sum sum;

            sum = delegate (int a, int b) //대리자에 메소드이름으로 대리맡기지않고 바로 함수를 만들어서 대리맡김
            {
                return a + b;
            }; 

            Console.WriteLine(sum(1, 2).ToString());
   

        }

       
        
    }
}

위 코드의 출력 결과는 3입니다.

 

<이벤트>

이벤트란 실제로 어떤일이 일어날 경우에만 실행되는 대리자라고도 할 수 있습니다.

대리자는 임의로 호출 할 수 있지만, 이벤트는 그 목적성에따라 임의로 호출 할 수 없고 실제로 어떤일이 일어날경우에만 실행됩니다.

따라서 객체 지향 프로그래밍의 은닉성을 표현할 수 있습니다.

예를 들어, 버튼이 눌리면 실행되는 이벤트는 실제 버튼이 눌리면 실행이됩니다.

만약 이벤트가 아니엿다면 버튼이 눌리지않더라도 버튼이 눌렸다고 프로그래밍을 할 수 있게됩니다.

이벤트의 선언은 event 키워드로 사용이됩니다.

코드부터 보시죠.

아래코드는 3,6,9에 짝을 출력하는 코드입니다.

using System;

namespace StudyCSharp
{
    delegate void EventHandler(string message); //메세지를 주면 반환값이 없는 대리자

    class Notifier //알람 클래스
    {
        public event EventHandler WhatHappen; //대리자를 이벤트로 등록 
        public void Dosomething(int number) //무언가 일어나는 메소드가 실시되면
        {
            int temp = number % 10;

            if(temp != 0 && temp % 3 == 0)
            {
                WhatHappen(number.ToString() + " : 짝"); //이벤트가 발생!
            }
        }
    }
    class MainApp
    {

        static public void MyHandler(string message) //이벤트에 추가할 메소드
        {
            Console.WriteLine(message);
        }

        static void Main(string[] args)
        {
            Notifier notifier = new Notifier(); //알람 객체를 만들고

            notifier.WhatHappen += MyHandler; //알람객체의 이벤트에 메소드를 추가

            for(int i = 0; i < 30; i++)
            {
                notifier.Dosomething(i); //무언가 일어나는 메소드 실시 -> 이벤트 발생
            }
            
            //notifier.WhatHappen("테스트"); -> 에러가 출력, 이벤트는 객체 외부에서 직접 호출불가

            
        }

       
        
    }
}

이벤트는 대리자를 먼저 선언하고 클래스를 만든다음, 클래스 안에 이벤트를 대리자로 등록을 합니다.

대리자는 메소드의 매개변수와 반환값을 정해줍니다.

그리고 메인 메소드에서 그 클래스의 객체를 생성하고, 객체의 이벤트에 직접 메소드를 추가 할 수 있습니다.

이후 객체의 이벤트가 발생될 조건을 충족시키면 이벤트가 발생이됩니다.

또한 맨아래의 코드처럼 이벤트는 객체 외부에서 직접 호출이 불가합니다.

 

Comments