250x250
Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

minjea.dev의 코딩블로그

[c#] 델리게이트 본문

코딩강좌/c#

[c#] 델리게이트

minjea.dev 2022. 4. 21. 12:00
728x90

델리게이트는 메서드를 참조할수 있는 하나의 타입으로써, c#에서 제공하는 특별한 구문입니다. 델리게이트는 다음처럼 선언이 가능합니다.

접근제한자 delegate 반환타입(매개변수);

델리게이트는 반환타입과 매개변수가 동일한 메서드를 가리킬수 있습니다. 즉, 다음과 같이 사용이 가능합니다.

// Example 클래스의 Write 메서드를 가리킬수 있는 델리게이트 생성
public delegate void ExampleDelegate(string n);
Example example = new Example();
// ExampleDelegate 타입의 인스턴스 생성. example.Write 메서드를 가리킴.
ExampleDelegate ex = new ExampleDelegate(example.Write);

class Example {
    public void Write(string n) {
        Console.WriteLine(n);
    }
}

ExampleDelegate 타입의 인스턴스인 ex는 메서드를 가르키고 있으니, 메서드를 호출하는 역할을 합니다. 즉, 다음 두 코드는 동일하게 작동합니다.

example.Write("동일");
ex("동일");

또한, 델리게이트의 반환값과 매개변수가 완벽하게 동일한 메서드는 정적 메서드든, 인스턴스의 메서드의 상관없이 모두 가리키는것이 가능합니다. 또한 반환값으로 델리게이트를 전달할수도 있고, 인자로 델리게이트를 전달하거나, 클래스의 멤버로 델리게이트를 정의할수도 있습니다.

 

또한 델리게이트 인스턴스가 하나의 메서드가 아닌 여러개의 메서드를 동시에 가리킬수도 있습니다. 아까 정의한 Example 클래스와, ExampleDelegate를 이용해 여러개의 메서드를 가리키는 코드를 작성해 보겠습니다.

Example example1 = new Example();
Example example2 = new Example();
Example example3 = new Example();
Example example4 = new Example();

// 델리게이트 정의
ExampleDelegate ex = example1.Write;
ex += example2.Write;
ex += example3.Write;
ex += example4.Write;

ex("hello");

// ExampleDelegate 정의
public delegate void ExampleDelegate(string n);

class Example
{
    public void Write(string n)
    {
        Console.WriteLine(n);
    }
}

델리게이트에서는 += 연산자를 이용해서 메서드를 델리게이트 인스턴스에 추가할수 있는데, 그렇다면 -=을 사용하면 어떻게 될까요? 바로 메서드 보관 목록에서 해당 메서드를 제거해줍니다. 그럼 한번 테스트를 해 볼까요? 아까 코드에 -=를 이용하여 example2.Write 메서드를 한번 제거해보겠습니다.

Example example1 = new Example();
Example example2 = new Example();
Example example3 = new Example();
Example example4 = new Example();

// 델리게이트 정의
ExampleDelegate ex = example1.Write;
ex += example2.Write;
ex += example3.Write;
ex += example4.Write;

// 메서드 보관 목록에서 example2.Write 메서드를 제거
ex -= example2.Write;

// hello 3개가 뜨게 됨
ex("hello");

// ExampleDelegate 정의
public delegate void ExampleDelegate(string n);

class Example
{
    public void Write(string n)
    {
        Console.WriteLine(n);
    }
}

이렇게 오늘 메서드를 가리키는 델리게이트에 대하여 배워 보았습니다. 다음에는 인터페이스에 대해 배워보도록 하겠습니다.

728x90