C#교과서 마스터하기 29. 대리자(Delegate)

min seung moon·2021년 7월 13일
0

C#

목록 보기
30/54
post-thumbnail

https://www.youtube.com/watch?v=GXuKiifDpjE&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=63

1. 대리자(Delegate)

  • 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조(포인터)를 나타내는 형식
    • 메서드 대신 호출
  • 자동차 세계에서의 대리 운전
  • 메서드의 매개 변수에 메서드 자체(대리자)를 전달 가능
    • 내장된 닷넷 API에 많이 사용

2. 프로젝트

01. 코딩(delegate)

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace testProject
{
    class Program
    {
        static void GoForward() => WriteLine("직진");
        static void GoLeft() => WriteLine("좌회전");
        static void GoFast() => WriteLine("과속");

        // 대리자, 메서드 시그니처 타입이 중요
        delegate void CarDriver();
        static void Main()
        {
            GoForward(); // [1] 내가 직접 운전
            CarDriver goHome = new CarDriver(GoForward); // [2] 대리 운전
            goHome += GoLeft;
            goHome += GoFast;
            goHome += GoFast;
            goHome -= GoFast;
            goHome.Invoke();
            goHome();
        }

    }
}

02. 익명 함수, 람다식, 내장 대리자 사용

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace testProject
{
    class Program
    {
        static void GoForward() => WriteLine("직진");
        static void GoLeft() => WriteLine("좌회전");
        static void GoFast() => WriteLine("과속");
        // 익명함수로 만들어서 대입해보기
        // static void GoRight() => WriteLine("우회전");

        // 대리자, 메서드 시그니처 타입이 중요
        delegate void CarDriver();

        static void RunLamda(Action action) => action();
        static void Main()
        {
            //GoForward(); // [1] 내가 직접 운전
            CarDriver goHome = new CarDriver(GoForward); // [2] 대리 운전
            goHome += GoLeft; goHome += GoFast; goHome -= GoFast;

            // 익명 함수
            goHome += delegate () { WriteLine("우회전"); };
            // goHome += delegate { WriteLine("후진"); };

            // 람다식
            goHome += () => WriteLine("후진");
            goHome(); // goHome.Invoke();

            // 내장된 대리자 형식을 통해서 직접 대리자 개체 생성 : Func<T>, Predicate<T>, ...
            Action driver = GoForward;
            driver += GoLeft;
            driver += () => WriteLine("후진");
            driver();

            RunLamda(() => WriteLine("매개 변수로 람다식(함수 이름, 무명 메서드) 전달"));
        }

        

    }
}

profile
아직까지는 코린이!

0개의 댓글