본문 바로가기
프로그래밍언어 & 프레임워크/C#

C# 대리자(Delegate)

by 공부하는개미 2021. 5. 20.
반응형

 

아래 글은 C# 대리자 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 40단원 대리자 546 ~ 563페이지
  • 유튜브채널 VisualAcademy [C# 교과서 마스터하기 40. 대리자(Delegate)]

 

 

 

https://www.youtube.com/watch?v=GXuKiifDpjE 

 

 

 

 

 

✳대리자(Delegate)란?

 

  • 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조(포인터)를 나타내는 형식
    -> 메서드 대신 호출

  • 메서드의 매개 변수에 메서드 자체(대리자)를 전달 가능
    -> 내장된 닷넷 API에 많이 사용

  • 영어 단어 delegate는 '위임하다' 또는 '대신하다'의 의미가 있습니다
  • 함수 자체를 데이터 하나로 보고 의미 그대로 다른 메서드를 대신 실행하는 기능

 

 

 

 

 

예제코드

using System;

//[?] 대리자(Delegate): 대신, 위임, 함수 포인터, 메서드 대신 호출, 대리 운전, 메서드의 매개변수로 전달
using System;

class DelegateSample
{
    static void GoForward() => Console.WriteLine("직진");
    static void GoLeft() => Console.WriteLine("좌회전");
    static void GoFast() => Console.WriteLine("과속");
    //static void GoRight() => Console.WriteLine("우회전");
    delegate void CarDriver(); // 대리자 형식 생성

    static void Main()
    {
        //GoForward();  //[1] 내가 직접 운동
        //CarDriver goHome = new CarDriver(GoForward);  //[2] 대리 운전
        CarDriver goHome = GoForward;
        goHome += GoLeft;
        goHome += GoFast;
        goHome -= GoFast;
        goHome += delegate () { Console.WriteLine("우회전"); };  //[3] 무명 메서드/익명 함수
                                                                // goHome += delegate { Console.WriteLine("후진"); };
        goHome += () => Console.WriteLine("후진");  //[4] 람다 식
        goHome();  // goHome.Invoke();

        // 내장된 대리자 형식을 통해서 직접 대리자 개체 생성: Func<T>, Action<T>, Predicate<T>, ...
        Action driver = GoForward;
        driver += GoLeft;
        driver += delegate () { Console.WriteLine("우회전"); };
        driver += () => Console.WriteLine("후진");
        driver();  // 트리거(방아쇠)

        Action go = () => Console.WriteLine("운전");
        go();

        RunLambda(() => Console.WriteLine("매개 변수로 람다 식(함수 이름, 무명 메서드) 전달"));
    }
    static void RunLambda(Action action) => action();
}
반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 필드(Field)  (0) 2021.05.21
C# 이벤트(Event)  (0) 2021.05.21
C# 속성(Property)  (0) 2021.05.20
C# 예외처리하기(Exception)  (0) 2021.05.19
C# 인터페이스(Interface)  (0) 2021.05.18