반응형

1. Func? Action?


프로그램을 작성하던 중에 갑자기 무명 메소드가 필요해졌다고 생각해 보자.


무명 메소드를 사용하기 위해서는 이를 참조할 수 있는 델리게이트 변수가 있어야 하며,


또한 델리게이트 변수를 생성하기에 앞서 델리게이트 타입을 선언해야 한다.


그러면 각기 다른 타입의 무명 메소드를 여러개 만들 때는 어떻게 해야할까?


당연히 무명 메소드마다 그 타입에 맞는 델리게이트 타입과 변수를 따로 따로 선언해야 할 것이다.


이는 매우 비효율적인 작업이기 때문에 C#에서는 Func과 Action이라는 델리게이트를 제공한다.



Func와 Action은 미리 선언된 델리게이트 변수로써 별도의 선언없이 사용가능하다.


Func는 반환값이 있는 메소드를 참조하는 델리게이트 변수이고,


Action은 반환값이 없는 메소드를 참조하는 델리게이트 변수이다.




2. Func 델리게이트


.NET Framework에는 총 17가지의 Func 델리게이트가 준비되어 있다.


즉, 매개변수가 없는 메소드부터 매개변수가 16개인 메소드까지 


총 17개의 메소드를 참조 가능하다는 말이다. (무명 메소드 뿐만 아니라 일반 메소드도 참조 가능)


이정도면 특별한 경우가 아니고서야 별도의 델리게이트를 만들어 쓸 필요가 없겠다.


Func 델리게이트 변수를 선언하는 방법은 다음과 같다.




매개변수와 반환값을 구분하기 위해 int형과 float형으로 나누었다.


보시다시피 매개변수는 앞에서 지정하고, 반환값은 맨 뒤에 지정하는 것을 확인할 수 있다.

 

( Func는 반환값을 가진 메소드를 참조하는 델리게이트이기 때문에,


반환형을 반드시 지정해주어야 한다. )


위와 같이 Func 델리게이트로 메소드를 참조하면 전처럼 델리게이트 타입을 선언하는 과정이 


불필요해지므로 아주 간결하게 코드를 작성할 수 있다.



그럼 이제 다음 예제를 작성해보자.







3. Action 델리게이트


Action 델리게이트는 Func와 똑같다. 다만 참조하는 메소드의 반환값이 없을 뿐이다.




반환값이 없는것 빼고는 Func랑 똑같아서 딱히 설명이 필요 없겠다.


바로 아래 예제를 작성해보자.




ref : http://mrw0119.tistory.com/23







이벤트가 생겨난 이유는 속성이 생긴 이유와 비슷하다데이터 접근에 한 단계를 더 추가하여 캡슐화를 강화한다는 것에 있다다른 코드가 클래스의 필드 값을 최소한의 검증 작업도 없이 직접 수정하는 것이 바람직하지 않듯이 클래스 외부의 다른 코드가 특정 이벤트의 핸들러를 변경/호출 하는 것도 바람직하지 않다.  실제로 이벤트를 사용하면 컴파일러는 이 선언을 private 델리게이트 Type Filed로 변환하고 Add/Remove 기본 메서드를 구현해준다클래스 내부에서는 이것이 필드로 보이고 외부에서는 이벤트로 보이는 것이다.

 

 

 

 

실습을 통한 확인 

 

 아래는 이를 분석하는 간단한 코드를 작성하고 이에 대한 역어셈블 및 IL코드를 통해서 확인해보자. 

 

이벤트를 사용하는 클래스를 이용하여 이벤트 핸들러를 등록하고 다른 클래스에서 호출하는 예

 

using System;

 

namespace EventDasm

{

    delegate void EventDelegate();

 

class MyEventClass

    {

        public event EventDelegate Event;

 

        public void EventHandler()

        {

            Event();

        }

    }

 

 

    class Program

    {

        static void Main(string[] args)

        {

            MyEventClass EventInstance = new MyEventClass();

            EventInstance.Event += new EventDelegate(EventInstance_Event);

 

            EventInstance.EventHandler();

        }

 

        static void EventInstance_Event()

        {

            Console.WriteLine("이벤트 발생");

        }

    }

}

 

다음은 위 코드의 MyEventClass에 대한 역어셈블 결과 및 IL코드이다.

Disassemble

IL코드

보이는 것처럼 CLR에 의하여 자동적으로 private 델리게이트 타입 필드가 생성되고이에 대한add/remove메서드가 생성된 것을 확인할 수 있다.

 

 

지금까지 내용을 한 마디로 정리하면 다음과 같다

                                    “Event Delegate를 캡슐화 시킨 것이다.”





ref : https://silent1002.blog.me/10086120655

반응형

+ Recent posts