[C#] 익명 메소드


C#에서는 익명 메소드라는 것이 있는데

말그대로 이름이 없는 메소드이다.


어떻게 이름이 없는 메소드가 있을까?

생각할 수 있지만 델리게이트를 통해

선언하고 사용될 수 있다. (밑의 예제 참고)




위의 궁금증보다 사실 이런 메소드를

대체 어디다 쓰려는 것일까? 라는 의문이 드는데

익명 메소드는 람다식에서 아주 유용하게

쓰인다고 하니 람다식을 공부하면서 좀 더

깊게 공부해보는 시간을 가지도록 하겠다.




delegate int Calculate (int a , int b);


public static void Main(){

Calculate Calc;

Calc = delegate ( int a, int b ){

return a + b;

}


Console.WriteLine("3+4 : {0}", Calc(3,4);

}




익명 메소드는 delegate 키워드를 이용하여 선언한다.

익명 메소드는 자신을 참조할 델리게이트의 형식과 동일해야 한다.

익명 메소드는 매개 변수의 형식, 개수까지도 동일해야 한다.


델리게이트가 참조할 메소드를 넘겨야 할 일이 생겼는데,

이 메소드가 두 번 다시 사용할 일이 없다고 판단 되면 그 때

사용하는 것이 익명 메소드란다. 매번 사용되고 복잡한

메소드라면 익명 메소드를 사용하지 않는 것이 바람직할 것이다.

(아직은 익명 메소드에 대해 감이 잘 잡히지 않는다.)




아래의 익명 메소드 예제를 보면서 포스팅을 마치도록 하겠다.




이렇듯 익명 메소드는 구현부가 항상 따라다니기 때문에

여러번 사용될 메소드라면 꽤나 번거로울 것이다. 그리고

복잡한 내용의 메소드라면 가독성을 해칠 수 있기 때문에

이 경우에도 사용하지 않는 것이 좋을 것이다. 이 익명 메소드는

후에 공부할 람다식에서 다시 자세하게 알아보도록 하겠다.


[C#] 일반화 델리게이트


델리게이트는 보통의 메소드뿐 아니라

일반화 메소드도 참조할 수 있다.

물론 이경우에는 델리게이트도 일반화

메소드를 참조할 수 있도록 형식 매개 변수를

이용해서 선언을 해주어야 한다.


delegate int Compare<T>(T a, T b);




그 전 포스팅에서 다루었던

오름차순 내림차순 함수를 참조하는 델리게이트와

이를 매개 변수로 받아서 정렬 방식을 결정하는

버블 소트의 예제를 일반화 버전으로 바꾸어 보겠다.




결과




일반화된 델리게이트로 수정했다.

위 부분에서 IComparable<T>를 상속받는부분이 있는데

이 부분에 대해서 좀 짚고 넘어가 보자.


System.Int32Pint), System.Double(double)을 비롯한

모든 수치 형식과 System.String(string)은 모두

IComparable을 상속해서 CompareTo() 메소드를구현하고 있다. 

CompareTo() --> 자신 보다 크면 -1, 같으면 0, 작으면 1을 반환




위의 코드에서 where T : IComparable<T>는

T가 무조건 IComparable<T>를 상속하는 파생클래스여야 한다는 뜻이다.

때문에 T는 CompareTo() 라는 메소드를 쓸 수 있어야 한다.




일반화된 델리게이트에 대해 알아보았다.

형식 매개 변수 제약에 관한 내용이 잠깐 나왔는데

이 부분에 대해서는 나중에 일반화 프로그래밍을

포스팅할 때 다뤄보도록 하겠다.




[C#] 델리게이트 (delegate)


델리게이트란?

델리게이트는 메소드에 대한 참조이다.

델리게이트에 메소드의 주소를 할당한 후

델리게이트를 호출하면 이 델리게이트가

메소드를 호출해준다.




언제 사용하는가?

프로그래밍을 하다 보면 '값'이 아닌 '코드'를 매개 변수로 넘기고

싶을 때가 있다. 배열을 정렬하는 메소드를 예로 들자면,

이 메소드가 오름차순으로 정렬할 것인지, 내림차순으로

정렬할 것인지, 아니면 특별한 계산식에 의해 정렬할 것인지

이 메소드가 정렬을 수행할 때 사용하는 비교 루틴을

매개 변수로 넣을 수 있다면 아주 유연한 프로그램이 될 것이다.

이에 대한 예시는 밑에서 다시 다루도록 하겠다.




C++ STL의 알고리즘에 함수 포인터를

이용한 콜백 메커니즘이 사용되는데

델리게이트 또한 이 함수포인터와

유사하다고 생각하면 될 듯하다.




한정자 delegate  반환형식 델리게이트 이름 ( 매개변수 목록 );

ex) delegate int MyDelegate ( int a , int b);


--> 참조할 메소드의 반환 형식과 매개 변수를 명히해줘야 한다.

--> 델리게이트는 인스턴스가 아닌 형식이다.

--> 따라서 MyDelegate의 인스턴스를 따로 만들어야 한다.




ex)

int Plus (int a, int b){ ... }

MyDelegate CallBack;

CallBack = new MyDelegate(Plus);

--> new 연산자를 사용하여 인스턴스를 만든다.




ex)




결과




오늘은 C#의 델리게이트(delegate)에 대해 알아보았다.

그냥 함수 포인터인 것 같다. (아직까지는..)

다음 시간에는 일반화된 델리게이트에 대해 알아보겠다.




+ Recent posts