델리게이트 (Delegate)

A Code AM·2020년 3월 10일
0

모르고 썼다

목록 보기
4/7
post-thumbnail

Delegate

: 위임하다, 대리인 이라는 뜻 -> 메소드를 참조하는 변수 = 메소드를 대신해서 호출됨

1. 메소드와 동일한 타입의 델리게이트 타입으로 선언해야 한다.

// delegate 반환타입 델리게이트이름 ( 매개변수 );
delegate void typeA( void ); 	//void funcA (void)
delegate void typeB( int );	//void funcB (int)
delegate float typeC( float );	//float funcC (float)
delegate string typeD( int );	//string funcD (int)

델리게이트의 매개변수도 메소드의 매개변수 타입과 갯수랑 맞춰줘야 한다.

2. 선언한 델리게이트 타입으로 변수 생성하고 해당 메소드를 참조시킨다.

typeA delegate 0;
typeB delegate 1;
typeC delegate 2;
typeD delegate 3;

delegate0 = new typeA(funcA);
delegate1 = new typeB(funcB);
delegate2 = new typeC(funcC);
delegate3 = new typeD(funcD);

델리게이트는 언제 사용하나 => CALLBACK 메소드를 구현할 때 사용한다.

CALLBACK ? > A란 메서드 호출할 때 B라는 메소드 넘겨줘서 A메소드로 하여금 B메소드를 호출하도록 하는것. A메소드를 콜백 메소드라고 한다.

일반화 델리게이트

: 템플릿 사용해서 어떤 타입 메소드든지 참조시킬 수 있다.

델리게이트 체인 = 멀티캐스트 델리게이트

: 델리게이트는 여러 개의 메소드를 동시에 참조할 수 있다 > 참조된 메소드들 차례대로 호출함.
+, +=연산자 또는 Combine()메소드 이용해서 메소드 결합
-, -=연산자 또는 Remove()메소드 이용해서 메소드 제거 (Combine()으로 연결하면 Remove()로 제거해야함)

MyDelegate del;
del = new MyDelegate( func0 );
del += func1;
del += func2;

익명 메소드(Anonymous Method)

: 이름 없는 메소드 (이름 없고 매개변수 넣는 곳만 있음)
델리게이트의 인스턴스가 메소드의 구현이 담겨 있는 코드 블록을 참조
delegate 키워드로 선언하고 자신을 참조할 델리게이트와 형식 및 매개변수가 동일하여야 함

delegate instance = delegate ( 매개변수 )
					{
                    	// 코드
                    }

이벤트

: 어떤 사건이 발생했음을 알려주는 객체 => 델리게이트를 event 한정자로 수식하여 생성함.
동작 원리는 델리게이트와 비슷. 이벤트 핸들러를 등록하지 않아도 컴파일 에러가 발생하지 않는다. 이벤트 선언시 비어있는 익명 메소드로 초기화 해두면 프로그램 다운을 방지한다.

이벤트 선언 및 호출 순서
1. 델리게이트 객체 선언
2. 이벤트 객체 선언
3. 이벤트 핸들러 작성
4. 이벤트 객체에 이벤트 핸들러 등록
5. 이벤트 발생 시 이벤트 핸들러 호출

namespace MyFirstConsoleApp
{
	// 1. 델리게이트 선언
    delegate void EventHandler(string message);
    
    class MyNotifier
    {
    	// 2. 델리게이트 인스턴스를 event 한정자로 수식하여 이벤트 객체 선언
        public event EventHandler SomethingHappened;
        
        // 3. 이벤트 핸들러 작성
        public void MyHandler (string message)
        {
        	Console.WriteLine(message);
        }
        
        public void EventCheck(int a)
        {
        	int temp = a % 2;
            
            // 5. 이벤트 발생 시 이벤트 핸들러 실행
            if(temp == 0)
            	SomethingHappened(String.Format("{0}: 짝수", a));
        }
   }
   
   class Program
   {
   	public static void Main(string[] args)
    	{
        	// 4. 이벤트 객체에 이벤트 핸들러 등록
            MyNotifier notifier = new MyNotifier();
            notifier.SomethingHappened += new EventHandler(notifier.MyHandler);
            
            for(int i = 0; i < 10; i++)
            	notifer.EventCheck(i);
        }
   }
}

델리게이트와 이벤트

: 델리게이트는 public이나 internal 키워드로 구현되면 클래스 외부에서도 호출 가능
이벤트는 public으로 선언되어도 외부에서 호출이 안된다.
델리게이트CALLBACK 용도로, 이벤트객체의 상태변화나 사건 발생 알리는 용도로 구분해서 사용한다.

profile
배움기록

0개의 댓글