C#

C# 델리게이트

anvil925 2025. 3. 6. 21:35
728x90
반응형

using System;

// C# 델리게이트(Delegate)
// 델리게이트는 메서드를 참조하는 개체로, 메서드를 다른 메서드에 전달하거나 메서드를 반환하는 데 사용된다.
// 델리게이트는 메서드 시그니처를 정의하고, 메서드를 참조하는 개체로 사용된다.
// 다른 프로그래밍 언어에서는 함수 포인터 또는 콜백 함수라고 한다.

// 델리게이트 구현
// 메서드 등록하여 호출하는 예제

delegate int Calcultate(int a, int b); // 델리게이트 선언
class Delegate
{
    static int Add(int a, int b) // 델리게이트로 참조할 메서드
    {
        return a + b;
    }
    
    static void Main()
    {
        // 메서드 등록
        Calcultate calc = Add; // 델리게이트에 메서드 등록
        Console.WriteLine(calc(3, 4)); // 델리게이트로 메서드 호출
        // 출력 결과: 7

        // 델리게이트 사용
        int result = calc(5, 6); // 델리게이트로 메서드 호출
        Console.WriteLine("결과 " + result); // 결과 출력
        // 출력 결과: 결과 11
    }

    // 하나이상의 메서드 등록
    // 델리게이트는 하나 이상의 메서드를 등록할 수 있다.
    // 델리게이트에 등록된 메서드는 등록된 순서대로 호출된다.
    // 델리게이트에 등록된 메서드는 += 연산자를 사용하여 등록한다.
    // 델리게이트에 등록된 메서드는 -= 연산자를 사용하여 제거한다.

    // 예제
    // 델리게이트에 여러 메서드 등록하여 호출하는 예제

    delegate void Print(); // 델리게이트 선언

    static void Print1() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("첫 번째 메서드");
    }

    static void Print2() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("두 번째 메서드");
    }

    static void Main2()
    {
        // 메서드 등록
        Print print = Print1; // 델리게이트에 메서드 등록
        print += Print2; // 델리게이트에 메서드 등록
        print(); // 델리게이트로 메서드 호출
        // 출력 결과:
        // 첫 번째 메서드
        // 두 번째 메서드
    }

    // 델리게이트 제거
    // 델리게이트에 등록된 메서드는 -= 연산자를 사용하여 제거할 수 있다.

    // 예제
    // 델리게이트에 등록된 메서드 제거하는 예제

    delegate void Print3(); // 델리게이트 선언

    static void Print4() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("첫 번째 메서드");
    }

    static void Print5() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("두 번째 메서드");
    }

    static void Main3()
    {
        // 메서드 등록
        Print3 print = Print4; // 델리게이트에 메서드 등록
        print += Print5; // 델리게이트에 메서드 등록
        print(); // 델리게이트로 메서드 호출
        // 출력 결과:
        // 첫 번째 메서드
        // 두 번째 메서드

        // 메서드 제거
        print -= Print4; // 델리게이트에 등록된 메서드 제거
        print(); // 델리게이트로 메서드 호출
        // 출력 결과:
        // 두 번째 메서드
    }

    // 델리게이트 반환
    // 델리게이트는 메서드를 반환하는 데 사용할 수 있다.
    // 델리게이트를 반환하려면 델리게이트를 반환 타입으로 지정하면 된다.

    // 예제
    // 델리게이트를 반환하는 예제

    delegate int Calculate2(int a, int b); // 델리게이트 선언

    static Calculate2 GetCalculation() // 델리게이트를 반환하는 메서드
    {
        Calculate2 calc = (a, b) => a + b; // 델리게이트에 람다식으로 메서드 등록
        return calc; // 델리게이트 반환
    }

    static void Main4()
    {
        // 델리게이트 반환
        Calculate2 calc = GetCalculation(); // 델리게이트 반환
        Console.WriteLine(calc(3, 4)); // 델리게이트로 메서드 호출
        // 출력 결과: 7
    }

    // 공격 콜백 예제
    // 델리게이트를 사용하여 공격 콜백을 구현하는 예제

    delegate void Attack(); // 델리게이트 선언

    static void SwordAttack() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("칼 공격");
    }

    static void MagicAttack() // 델리게이트로 참조할 메서드
    {
        Console.WriteLine("마법 공격");
    }

    static void AttackTarget(Attack attack) // 델리게이트를 매개변수로 받는 메서드
    {
        attack(); // 델리게이트로 메서드 호출
    }

    static void Main5()
    {
        // 공격 콜백
        AttackTarget(SwordAttack); // 델리게이트로 메서드 호출
        // 출력 결과: 칼 공격
        AttackTarget(MagicAttack); // 델리게이트로 메서드 호출
        // 출력 결과: 마법 공격
    }
}
728x90
반응형

'C#' 카테고리의 다른 글

C# 예외 처리, 값형과 참조형식  (0) 2025.03.04
C# 인터페이스와 열거형  (0) 2025.03.03
C# 고급 문법과 기능  (0) 2025.02.20
C# 클래스와 객체  (0) 2025.02.13
C# 메서드(Method)와 구조체(Structures)  (0) 2025.02.11