본문 바로가기
Programming

C# 델리게이트와 이벤트

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 12. 10.
반응형

델리게이트(delegate) 선언 및 사용

   델리게이트는 메서드 참조를 안전하게 나타내는 타입입니다. 메서드의 호출을 캡슐화하고, 여러 메서드를 하나의 델리게이트로 결합할 수 있습니다.

델리게이트 선언

델리게이트는 특정 시그니처(매개변수와 반환 타입)를 가진 메서드를 참조할 수 있도록 정의됩니다.


// 델리게이트 선언
public delegate void Notify(string message);

// 메서드 선언
public static void SendMessage(string message)
{
    Console.WriteLine("메시지: " + message);
}

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성
        Notify notify = new Notify(SendMessage);
        // 델리게이트 호출
        notify("안녕하세요, 델리게이트!");
    }
}

위 코드에서는 `Notify`라는 델리게이트를 선언하고, `SendMessage`라는 메서드를 델리게이트로 호출합니다. 델리게이트는 메서드처럼 사용되며, 메서드를 참조하고 호출하는 역할을 합니다.

익명 메서드, 람다식

델리게이트는 익명 메서드나 람다식과 함께 사용할 수 있습니다. 이를 통해 코드가 간결하고 읽기 쉽게 됩니다.

익명 메서드 사용


// 익명 메서드 사용
Notify notify = delegate(string message)
{
    Console.WriteLine("익명 메서드: " + message);
};

notify("익명 메서드 예제!");

위 예제에서는 `delegate` 키워드를 사용하여 익명 메서드를 덧붙여 델리게이트를 인스턴스화했습니다.

람다식 사용


// 람다식 사용
Notify notify = (message) => Console.WriteLine("람다식: " + message);

notify("람다식 예제!");

람다식을 사용하면 더 간결하게 델리게이트를 정의할 수 있습니다. `=>` 문법을 사용하여 함수 본문을 한 줄로 작성할 수 있습니다.

이벤트(event) 선언 및 구독

이벤트는 델리게이트를 기반으로 하며, 객체 간의 통신을 처리하는 데 사용됩니다. 이벤트는 일반적으로 특정 조건에서 발생하는 메서드 호출을 다룹니다.

이벤트 선언


// 이벤트 선언
public delegate void Notify(string message);

public class MessagePublisher
{
    public event Notify MessageSent;

    public void SendMessage(string message)
    {
        MessageSent?.Invoke(message); // 이벤트 발생
    }
}

class Program
{
    static void Main()
    {
        MessagePublisher publisher = new MessagePublisher();
        
        // 이벤트 구독
        publisher.MessageSent += (message) => Console.WriteLine("이벤트 수신: " + message);

        publisher.SendMessage("이벤트 예제!");
    }
}

`MessageSent` 이벤트는 `SendMessage` 메서드에서 발생합니다. `MessageSent?.Invoke` 구문을 사용하여 이벤트가 발생했을 때 구독자에게 알립니다. 이벤트가 발생하면 구독한 메서드가 실행됩니다.

이벤트 구독 및 구독 해제

이벤트는 구독하고 해제하는 방식으로 동작합니다. 구독을 해제하려면 `-=` 연산자를 사용합니다.


class Program
{
    static void Main()
    {
        MessagePublisher publisher = new MessagePublisher();

        // 이벤트 구독
        publisher.MessageSent += (message) => Console.WriteLine("이벤트 수신: " + message);

        publisher.SendMessage("이벤트 발생!");

        // 이벤트 구독 해제
        publisher.MessageSent -= (message) => Console.WriteLine("이벤트 수신: " + message);

        publisher.SendMessage("이벤트 발생 후 구독 해제!");
    }
}

위 코드에서 이벤트 구독을 해제하는 방법을 보여줍니다. 이벤트가 발생한 후 더 이상 구독된 메서드가 실행되지 않습니다.

반응형

'Programming' 카테고리의 다른 글

C# WPF/WinForms UI 프로그래밍  (0) 2025.12.12
C# LINQ(Language Integrated Query)  (0) 2025.12.11
C# 컬렉션과 제네릭  (0) 2025.12.09
C# 객체지향 프로그래밍 (OOP)  (0) 2025.12.08
C# 클래스와 객체  (0) 2025.12.07