C#

C#문법-20 : Delegate 2 - 메소드의 파라미터로 delegate 사용하기

알통몬_ 2019. 6. 12. 17:25
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


Delegate

C#의 delegate는 

C 나 C++ 의 함수 포인터와도 비슷한 개념입니다.

메소드 파라미터와 반환 타입에 대한  정의 후 파라미터와 

반환 타입이 일치하는 메소드를 서로 호환하여 불러 쓸 수 있습니다.

=====================================================

delegate 예제

using System;
using System.Text;


namespace workspace_csharp {

public class Program {

delegate void CallDelegate(int x);

private void Running(int xx){
System.Console.WriteLine(xx);
}

private void Running2(int xxx) {
System.Console.WriteLine(xxx + xxx);
}

public void Method() {
CallDelegate callDelegate = new CallDelegate(Running);
callDelegate(1000);

callDelegate = Running2;
callDelegate(2000);
}

public static void Main(String[] args) {
Program pg = new Program();
pg.Method();
}
}

}

이전 포스팅에서의 예제와 유사하죠?

추가된 점은 이미 선언한 delegate를 새롭게 객체생성하지 않고

파라미터와 반환 타입이 일치하는 다른 메소드로 변경할 수 있다는 점입니다.

=====================================================


=====================================================

Delegate를 메소드의 파라미터로

위 예제까지는 메소드를 delegate에 사용했는데요.

이번에는 메소드의 파라미터로 Delegate를 사용하는 예제입니다.

정수 배열의 값들을 오름차순과 내림차순 정렬을 하는 예제입니다.

using System;
using System.Text;


namespace workspace_csharp {

public class Program {

public delegate int CompareIntDele(int o1, int o2);
public static void Sorting(int[] arrays, CompareIntDele cid) {

if(arrays.Length < 2) {
return;
}
int result; // 0 or 1 or -1;
for(int i = 0; i < arrays.Length; i++) {
for(int j = i + 1; j < arrays.Length; j++) {

result = cid(arrays[i], arrays[j]);
if(result == -1) {
int temporary = arrays[j];
arrays[j] = arrays[i];
arrays[i] = temporary;
}
}
}
Show(arrays);
}

static void Show(int[] arrays) {
foreach(var value in arrays) System.Console.Write(value + "\t");
System.Console.WriteLine();
}

void Running() {
int[] points = {100, 94, 77, 83, 57, 42};

CompareIntDele cid = Ascending;
Sorting(points, cid);


cid = Descending;
Sorting(points, cid);
}

// CompareIntDele 와 파라미터와 반환 타입이 일치하는 메소드들
int Ascending(int o1, int o2) {
if(o1 == o2) return 0;
return (o2 > o1) ? 1 : -1;
}
int Descending(int o1, int o2) {
if(o1 == o2) return 0;
return (o2 < o1) ? 1 : -1;
}
// ======================================================

public static void Main(String[] args) {
new Program().Running();
}
}

}

이상입니다.

다음 포스팅에서는 delegate 세 번째 포스팅으로 delegate 필드와

delegate 속성에 대해 공부합니다.


반응형