본문 바로가기
개발일지/C#

C# Delegate

by 태운콩즙 2024. 10. 2.
728x90
반응형

Delegate

메소드에 대한 참조 델리게이트도 하나의 데이터 형식으로 인스턴스 메소드 , 정적 메소드 모드 참조가능하다 델리게이트는 값이 아닌 “코드”자체를 넘기고 싶을때 사용한다

예를 들어 어떤 데이터들을 정렬 해야 할 때 다양한 정렬 조건이 있을 수 있는데 이때 원하는 정렬 조건에 대한 메소드만 꺼내주면 된다

void RunA(int i)
{
......
}

위와 같이 하나의 함수가 있다고 가정하면 이 함수는 정수 하나를 파라미터로 받아들인다 이 함수를 호출하기 위해서는 다음과 같이 정수를 메서드 파라미터로 넘기면 된다

int j = 1234;

RunA(j);

더 복잡한 경우로는 다음과 같이 클래스 객체를 넘기는 경우를 생각해 볼 수 있다

void RunB(TestClass c)
{
	.....
}

이 경우는 위의 int 와 같은 Built-in 타입이 아니므로 개발을 할 때 그 타입을 어딘가 에서 정의해 주어야 한다

class TestClass
{
	int id; // 필드
	string name;
	public void Display(){} // 메서드
}

이 함수 (RunB) 를 호출하기 위해서는 아래와 같이 클래스 인스턴스 를 만들어 이를 메서드 파라미터로 넘기면 된다

TestClass c = new TestClass();
RunB(c);

위의 두 가지 케이스를 보면 파라미터로서 정수 혹은 객체 즉 어떤 데이터를 메서드 에 보내고 있는 것을 알 수 있다

Delegate는 메서드 를 다른 메서드 로 보내기 위해 만들어졌다 숫자 혹은 객체를 메서드 의 파라미터로써 전달 할 수 있듯이 메서드 또한 파라미터로 전달 할 수 있다

Delegata는 메서드의 입력 파라미터로 피 호출자 에게 전달될 수 있을 뿐만 아니라 또한 메서드의 리턴 값으로 호출자에게 전달 될 수도 있다

void Run(exDelegate method)
{
	....
}

위와 같은 함수를 가정했을때 exDelegate가 델리게이트 타입이라고 가정했으래 이 함수는 어떤 메서드 Run() 메서드에 전달하고 있는것이다

델리게이트 타입 정의

delegate int exDelegate(string s);

위의 예제의 경우 C# 키워드 class 를 사용하여 해당 클래스를 정의 하였는데 델리게이트 타입을 정의 하기 위해선 delegate 를 사용한다

델리게이트 정의에서 중요한것은 입력 파라미터와 리턴 타입이다

어떤 메서드가 이러한 델리게이트 메서드 원형과 일치한다면 즉 입력 파라미터 타입 및 갯수 리턴 타입이 동일하다면 그 메서드는 해당 델리게이트 에서 사용 될 수 있다

델리게이트 정의는 마치 하나의 함수를 정의하는 Prototype 선언식 처럼 보이는데 사실 내부적으로 이 선언식은 컴파일러에 의해 특별한 클래스로 변환된다

이렇게 C# delegate 식을 클래스가 아닌 함수 선언식 처럼 정의하게 한 것은 내부의 복잡한 설계를 숨기고 메서드를 전달하는 본연의 의도를 더 직관적으로 표현하기 위한 것으로 볼수있다

델리게이트가 이렇게 정의된 후에는 클래스 객체를 생성한것과 비슷한 방식으로 new 를 써서 델리게이트 객체를 생성한다

델리게이트를 써서 다른 메서드에 전달하는 방식은 델리게이트 객체를 메서드 호출 파라미터에 넣으면 된다 이는 메서드 정보를 갖는 Wrapper 클래스의 객체를 다른 메서드의 입력 파라미터로 전달하는 것이 된다

// int StringToInt(string s)
{
	....
}

ExDelegate m = new exDelegate(StringToInt);
Run(m);

전달된 델리게이트로 부터 실제 메서드를 호출 하는 것은 델리게이트 객체의 .Invoke() 메서드나 .BeginInvoke() 메서드를 써서 호출한다

i = m.Invoke("1234");

//Invoke 생
i = m("123");

예제

class Program
{
    static void Main(string[] args)
    {
        new Program().Test();
    }

    // 델리게이트 정의
    delegate int ExDelegate(string s);

    void Test()
    {
        //델리게이트 객체 생성
        ExDelegate m = new ExDelegate(StringToInt);

        //델리게이트 객체를 메서드로 전달
        Run(m);
    }

    // 델리게이트 대상이 되는 어떤 메서드
    int StringToInt(string s)
    {
        return int.Parse(s);
    }

    // 델리게이트를 전달 받는 메서드
    void Run(ExDelegate m)
    {
        // 델리게이트로부터 메서드 실행
        int i = m("123");

        Console.WriteLine(i);
    }
}
728x90
반응형

'개발일지 > C#' 카테고리의 다른 글

회계 관리 프로그램 예제  (1) 2024.11.09
인사 급여 관리 프로그램 예제  (0) 2024.11.08
C# Indexer  (0) 2024.10.02
yield  (5) 2024.10.01
C#) ref  (0) 2024.10.01