-
대리자(Delegate)C# 2022. 1. 25. 18:58
1. delegate
C++에서 함수포인터와 유사하다
함수포인터는 매개변수에 함수를 인자로받아서 함수를 호출하였다.
delegate도 마찬가지로 함수를 인자로받아서 함수를 호출할 수 있다.
delegate선언
delegate int GetNumber(int n);
delegate 사용예시
class Program { delegate int GetNumber(int n); static int AddOne(int number) { return number + 1; } static void Test(int n, GetNumber getnumber) { n = getnumber(n); Console.WriteLine(n); } static void Main(string[] args) { GetNumber getNumber = new GetNumber(AddOne); Test(2, getNumber); } }
AddOne함수는 매개변수로 들어온 값에 1을 더한 값을 반환하는 함수이다.
Test 함수는 매개변수로 int형과 delegate로 선언된 getNumber형의 함수를 인자로 받는다.
getNumber형의 매개변수는 int형이고 출력도 int형이므로 int MyFunc(int n)과 같은 함수의 형식만 인자로 받을 수 있다.
Main함수에서 정수 2와 AddOne함수를 인자로 받아서 3을 출력한다.
함수 간의 연산
using System; using System.Collections.Generic; namespace CSharp { class Orc { public int Hp { get; set; } = 100; // private int _hp; // public int GetHp() { return _hp; } // public void SetHp(int value) { _hp = value; } } class Program { delegate void GetNumber(ref int n); static void AddOne(ref int number) { number++; } static void AddOne2(ref int number) { number++; } static void Test(ref int n, GetNumber getnumber) { getnumber(ref n); Console.WriteLine(n); } static void Main(string[] args) { int x = 2; GetNumber getNumber = new GetNumber(AddOne); getNumber += AddOne2; Test(ref x, getNumber); } } }
AddOne2 함수를 새로 정의하고 모든 함수는 'int 함수명 int'에서 'void 함수명 int'로 바뀌었다.
그래고 참조연산을 위해 ref키워드를 새롭게 넣어줬다.
main함수 안에 보면 getNumber+= AddOne2 를 볼 수 있는데 getNumber 델리게이트는 먼저 AddOne를 실행하고 그 다음에 AddOne2함수를 순차적으로 실행하게 된다.
그래서 x의 값이 +1, +1 되어서 4의 값이 출력되는 것을 볼 수 있다.
'C#' 카테고리의 다른 글
람다식(Lambda) (0) 2022.01.26 이벤트(Event) (0) 2022.01.26 프로퍼티(Property) (0) 2022.01.25 추상클래스와 인터페이스(Interface) (0) 2022.01.25 object와 Generic(일반화) (0) 2022.01.25