본문 바로가기
C#

[C#] 대리자(Delegate; 델리게이트)와 무명 메서드(+람다식 기초)

by RucA 2024. 4. 26.
728x90
반응형

C#에서 중요한 개념 중 하나인 대리자에 대해서 정리해보겠다. 이후 이벤트와 연계해서 많이 사용한다.

 

 

대리자 (Delegate)


대리자는 말 그대로 "대신하는" 형식으로, 매개변수와 반환 형식을 지정해서 메서드를 여러개 참조할 수 있다. 예를 들어, 플레이어가 쓰는 한 스킬이 여러 기본 동작을 연계하는 것이라면, 새로운 메서드를 만들거나 해당하는 메서드를 모두 입력하는 것이 아니라 대리자에 플레이어의 동작에 해당하는(지정된 매개변수와 반환 형식) 메세드들을 등록하는 것으로 손쉽게 객체 지향적으로 구현할 수 있으며, 이는 이후 이벤트와 연계하기 좋다.

 

  • 대리자 사용법
using System;

class DelegatePractice
{
    //함수(메서드)들 생성
    static void Hi() => Console.WriteLine("Hi");
    static void Hello() => Console.WriteLine("Hello");
    static void HiKor() => Console.WriteLine("안녕");

    //대리자  생성 : 매개변수와 반환값이 없는 메서드도 담을 수 있다.
    delegate void SayDelegate();
    
    static void Main()
    {
        //대리자에 메서드들 등록   
        SayDelegate say = new SayDelegate(Hi);
        say += new SayDelegate(Hello);
        say += new SayDelegate(HiKor);
        
        //위를 이렇게 줄일 수 있다   
        SayDelegate say2 = Hi;
        say2 += Hello;
        say2 += HiKor;

        //대리자 사용해 호출하는 방법
        say();
        say.Invoke();
    }
}
//출력 : Hi Hello 안녕 Hi Hello 안녕

 

위처럼 대리자는 마치 여러 메서드들의 집합을 가리키는 포인터라고 볼 수 있다. 이를 활용해 이름 없는 메서드를 대리자를 활용해 만들어 호출할 수 있다.

 

 

무명 메서드와 람다식으로 대체하기


대리자를 함수 포인터처럼 사용해서 delegate 키워드로 무명 메서드를 생성 및 호출할 수 있다. 다만 람다 식을 활용하면 같은 효과를 더 직관적이고 간결하게 표현할 수 있기에 간단히 다루고 람다 식으로 대체하는 법(기초)를 정리한다. 람다 식은 이후 따로 자세하게 다룰 예정

 

  • delegate 키워드를 사용한 무명 메서드 사용

 

using System;

class DelegatePractice
{
    //대리자  생성
    delegate void HiDelegate(string msg);
    delegate void AddDelegate(int a, int b);
    
    static void Main()
    {
        //무명 메서드 생성 
        HiDelegate hi = delegate(string msg)
        {
            Console.WriteLine(msg);
        };

        //대리자 사용해 호출
        hi("hi anonymous!");
        
        //무명 메서드 생성
        AddDelegate add = delegate(int a, int b)
        {
            Console.WriteLine(a + b);
        };
        
        //대리자 사용해 호출
        add(3, 6);
    }
}
//출력 : hi anonymous! 9

 

위의 예제를 보면 메서드를 가리키는 포인터처럼 사용하면서 함수(메서드)를 선언하고 정의하는 것과 유사하게 사용할 수 있다. 다만 람다 식을 사용해서 이를 훨씬 간결하게 사용할 수 있다. 이후 자세히 다루겠지만, 람다식을 사용하는 방법은 다음과 같다.

 

  • 대리자 + 람다식 : 코드를 간결하게 하며, 람다 식에서 형식을 선언할 수 있다
    • 참고 - 람다식 형식1(식 람다) : (매개 변수) => (식)
    •         - 람다식 형식2(문 람다) : (매개 변수) => { (문); }
using System;

class DelegatePractice
{
    //대리자  생성
    delegate void HiDelegate(string msg);
    delegate void AddDelegate(int a, int b);
    
    static void Main()
    {
        //람다식 활용해 생성
        HiDelegate hi = (string msg) => Console.WriteLine(msg);
        //대리자 사용해 호출
        hi("hi anonymous!");
        
        //람다식 활용해 생성
        AddDelegate add = (int a, int b) => Console.WriteLine(a + b);
        //대리자 사용해 호출
        add(3, 6);
    }
}
//출력 : hi anonymous! 9

 

만약 대리자를 생성할 때 선언한 반환값 형식이나 매개 변수 형식과, 람다식의 매개변수 및 반환값의 형식이 다를 경우 오류가 발생하며 좀 더 안정적인 구현이 가능하다

728x90
반응형