더북(TheBook)

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();
        }
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.