40.3 대리자를 사용하여 메서드 여러 개를 다중 호출하기

    이제 대리자 형식의 변수 하나에 메서드 여러 개를 등록한 후 한 번에 여러 개를 호출하는 메서드 다중 호출 내용을 살펴보겠습니다.

     

    1.   새로운 C# 콘솔 프로젝트를 다음과 같이 만듭니다.

    프로젝트 형식

    템플릿

    이름

    위치

    Visual C#

    콘솔 앱 프로그램

    DelegatePractice

    C:\C#

     

    2.   솔루션 탐색기에서 Program.cs 파일을 DelegatePractice.cs 파일로 이름을 변경하고, 이미 만든 모든 코드를 삭제한 후 다음과 같이 프로그램을 만듭니다. 편의상 CarDriver 클래스의 멤버 메서드는 모두 정적(static) 멤버로 구성했습니다.

    //DelegatePractice.cs
    using System;
    
    namespace DelegatePractice
    {
        public class CarDriver
        {
            public static void GoForward() => Console.WriteLine("직진");
            public static void GoLeft() => Console.WriteLine("좌회전");
            public static void GoRight() => Console.WriteLine("우회전");
        }
    
        public class Insa
        {
            public void Bye() => Console.WriteLine("잘가");
        }
    
        //대리자 생성: 의미상으로 대리운전, class 같은 레벨로 생성해도 됨
        public delegate void GoHome();
    
        public class DelegatePractice
        {
            //대리자 형식 선언: 메서드를 묶을 별칭, 클래스 내부에도 생성 가능
            public delegate void Say();
    
            private static void Hello() { Console.WriteLine("Hello"); }
            private static void Hi() { Console.WriteLine("Hi"); }
    
            static void Main(string[] args)
            {
    
                //① 메서드는 따로따로 호출
                CarDriver.GoLeft();
                CarDriver.GoForward();
                CarDriver.GoRight();
    
                //② 대리자를 사용한 메서드 등록 및 호출
                GoHome go = new GoHome(CarDriver.GoLeft);
                go += new GoHome(CarDriver.GoForward);
                go += new GoHome(CarDriver.GoRight);
                go += new GoHome(CarDriver.GoLeft); //등록
                go -= new GoHome(CarDriver.GoLeft); //취소
                go();                               //집에 갑시다... 한 번 호출
    
                Console.WriteLine();
    
                //③ 대리자를 사용하여 한 번에 메서드 2개 호출...
                Say say;                //ⓐ 대리자 형식 변수 선언
                say = new Say(Hi);      //ⓑ Hi 메서드 지정
                say += new Say(Hello);  //ⓒ Hello 메서드 지정
                say();                  //ⓓ 대리자로 메서드 2개 호출
    
                //④ 대리자를 사용하여 호출
                Insa insa = new Insa();
                Say say2 = new Say(insa.Bye);
                say2 += new Say(insa.Bye);
                say2();
            }
        }
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.