본문 바로가기
Study/C#

[C#][Study][기초다지기] 딜리게이트 Delegate

by 스테디코디스트 2023. 9. 23.
반응형

 Delegate

- 메서드의 주소를 저장하고, 호출할 수 있음

- 내용을 가지지 않음

- 메서드를 캡슐화하기 때문에 안전하고, 객체지향적임

- 함수 포인터

- delegate와 delegate에 추가할 함수는 같은 리턴값을 가져야 함

 

[3가지 유형]

1) 매개변수가 없고, 리턴타입이 없는 유형

public delegate void TestDelegate();

2) 매개변수를 가지고, 리턴타입이 없는 유형

public delegate void TestDelegate(object obj1, object obj2);

3) 매개변수와 리턴타입이 모두 있는 유형

public delegate int TestDelegate(object obj1, object obj2);

 

[3가지 단계]

1) Declaration(선언)

2) Instantiation(인스턴스화)

3) Invocation(호출)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication2
{
    public class TestDelegate
    {
        // Declaration 선언
        // 매개변수와 리턴 값이 모두 없는 경우
        public delegate void FirstDelegate();
 
        public void fun1()
        {
            Console.WriteLine("I am Function 1");
        }
        public void fun2()
        {
            Console.WriteLine("I am Function 2");
        }
        public void fun3()
        {
            Console.WriteLine("I am Function 3");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            TestDelegate testdelegate = new TestDelegate();
            
            // Instantiation 인스턴스화
            TestDelegate.FirstDelegate fd1 = new TestDelegate.FirstDelegate(testdelegate.fun1);
            TestDelegate.FirstDelegate fd2 = new TestDelegate.FirstDelegate(testdelegate.fun2);
            TestDelegate.FirstDelegate fd3 = new TestDelegate.FirstDelegate(testdelegate.fun3);

            // Invocation 호출
            fd1();
            fd2();
            fd3();
 
            Console.ReadKey();
        }
    }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace DelegateExample
{
    class Program
    {
    	// 선언 -> 매개변수와 리턴값이 모두 있는 경우
        public delegate int calculator(int x, int y);
 
        static int Addition(int a, int b)
        {
            return a + b;
        }
        
        static int Subtraction(int a, int b)
        {
            return a - b;
        }
        
        static void Main(string[] args)
        {
            // 인스턴스화
            calculator c = new calculator(Program.Addition);
            Console.WriteLine("Addition of 5 and 10 is : {0}", c(5, 10)); // 호출
 
            // 인스턴스화
            calculator d = new calculator(Program.Subtraction);
            Console.WriteLine("Subtraction of 5 and 10 is : {0}", d(5, 10)); // 호출
 
            Console.ReadKey();
        }
    }
}