델리게이트(delegate)는 C#에서 함수포인터와 비슷한 역활을 담당한다.
우선 함수포인터에 대해서 알아보자.
함수포인터는 함수의 주소값을 저장하는 역활을 한다.
1 2 3 4 5 6 7 8 | int (*p)(int,int); int add(int a, int b){ return a+b; } p = add; p(3,2); // 5 리턴 | cs |
위와 같이 p가 함수포인터이다. 함수의 이름이 곧 함수의 주소값이기 때문에 p = add로 함수의 주소값을 함수포인터 p에 저장하였다.
함수 포인터와 같이 델리게이트(delegate)역시 함수를 대리호출 할 수 있다.
C#에서 함수포인터가 없고 델리게이트란 개념을 새로 만든 것은 포인터대신 참조자인 ref를 사용하는 것과 같은 이유이다.
주소값을 직접 저장하고 다루면 위험하기 때문이다.
사용자에게 주소값을 직접 다루지 않아도 포인터와 같은 역활을 하는 개념을 만든 것이다.
아래와 같은 형식으로 선언하면 된다.
delegate 반환형식 델리게이트이름 (매개변수 목록);
1 2 3 4 5 6 7 8 | delegate int TestDele(int a,int b); int add(int a, int b) { return a+b; } TestDele dele = new TestDele(add); dele(3,2); //5 리턴 | cs |
델리게이트(delegate) 체인은 하나의 델리게이트 안에 여러개의 함수를 연결하여 연쇄적으로 호출하는 방식이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | delegate void testDele(); static void Main(string[] args) { void print1() { Console.WriteLine("print1"); } void print2() { Console.WriteLine("print2"); } void print3() { Console.WriteLine("print3"); } testDele dele = new testDele(print1); dele += new testDele(print2); dele += new testDele(print3); dele(); } | cs |
- 출력 -
print1
print2
print3
위에서 보듯이 print1함수와 print2, print3 함수들을 델리게이트 testDele에 +=로 추가를 하고 dele()로 호출을 하니 넣은 순서대로 3개 함수가 모두 호출되는 것을 볼 수 있다.
'닷넷,C#,.NET' 카테고리의 다른 글
C#/.NET 세대별 가비지 컬렉션(Garbage collection) 동작 설명 (0) | 2018.05.10 |
---|---|
C#/.NET 델리게이트(delegate) 체인(chain) (0) | 2018.05.09 |
C#/.NET 연산자 오버로딩(operator) (0) | 2018.05.08 |
C#/.NET get,set 키워드를 이용한 프로퍼티 (1) | 2018.05.08 |
C# 7.0에서의 Out 변수 변경점 (0) | 2018.05.06 |