ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C#에서 Delegate와 event 활용
    카테고리 없음 2020. 6. 9. 11:01
    반응형

    델리게이트란 콜백을 표현하는 방식중의 하나입니다. 그렇다면 콜백이란 무엇일까요? 친구에게 택배를 보내고 친구가 받았는지 확인하는 과정의 대화를 보겠습니다.

     

    일반적인 경우

    나: 택배 받았어?

    친구: 아니 아직

    10분후 ….

    나: 택배 받았어?

    친구: 아니 아직

    10분후 ….

    나: 택배 받았어?

    친구: 응 받았어

    콜백

    나: 택배 받으면 알려줘!

    친구: 응

    20분후 ….

    친구: 나 택배 받았어.

    나: 응 그래!

     

    콜백이란 위와 같이 친구에게 받았는지 계속 확인하지 않고 택배 받으면 알려달라고 요청을 해서 응답을 받는 형태를 말합니다. delegate란 단어는 '위임'이라는 뜻입니다. 친구에게 알려달라고 '위임'하고 다른 일을 하면 됩니다. 위의 예제를 코드로 표현해보겠습니다. 키보드 관련한 내용 처리를 위해서 Keyboard라는 클래스를 만들고 키보드에서 특정 키가 눌렸을 경우 외부에서 그 이벤트를 받아서 화면에 출력하는 기능을 만들어 보도록 하겠습니다.

     

        public class Keyboard
        {
            public delegate void KeyboardEventHandler(Keys KeyCode); //delegate 형식 지정
            public KeyboardEventHandler KeyDown; //delegate 형식 정의
        }
     
        static class Program
        {
            public static void Program_KeyDown(Keys KeyCode)
            {
                Console.WriteLine(KeyCode.ToString());
            }
     
            [STAThread]
            static void Main()
            {
                var keyboard = new Keyboard();
                keyboard.KeyDown += Program_KeyDown; //키보드가 눌렸을때 이벤트 통보 받을 메소드 등록
     
                keyboard.KeyDown(Keys.Space); //스페이스키가 눌렸다.
            }
        }

     

    그럼 event 한정자란 무엇일까요? event를 지정하게 되면 해당 delegate는 오직 선언된 클래스 내부에서만 호출할 수 있습니다. 아래의 예제는 event를 사용한 델리게이트를 외부에서 호출했기에 문제가 발생합니다.

    public class Keyboard
        {
            public delegate void KeyboardEventHandler(Keys KeyCode);
            public event KeyboardEventHandler KeyDown; //event지정
        }
     
        static class Program
        {
            public static void Program_KeyDown(Keys KeyCode)
            {
                Console.WriteLine(KeyCode.ToString());
            }
     
            [STAThread]
            static void Main()
            {
                var keyboard = new Keyboard();
                keyboard.KeyDown += Program_KeyDown;            
                keyboard.KeyDown(Keys.Space); //여기서 에러 발생
            }
        }

     

    delegate를 event로 지정하면 오직 선언된 클래스 내부에서만 호출 가능하기에 public으로 외부에 함수를 노출해서 호출해야 합니다.

    public class Keyboard
        {
            public delegate void KeyboardEventHandler(Keys KeyCode);
            public event KeyboardEventHandler KeyDown;
     
            public void PressSpace()
            {
                KeyDown(Keys.Space);
            }
        }
     
        static class Program
        {
            public static void Program_KeyDown(Keys KeyCode)
            {
                Console.WriteLine(KeyCode.ToString());
            }
     
            [STAThread]
            static void Main()
            {
                var keyboard = new Keyboard();
                keyboard.KeyDown += Program_KeyDown;
     
                PressSpace(); //delegate를 직접호출하지 않고 외부로 노출된 메소드를 호출
            }
        }

    끝!!

     

     

     

    반응형
Designed by Tistory.