3_c#/C#문법

C# Delegate: 대리자

Mi:sAng 2024. 11. 20. 17:48

1. 대리자

  - 코드(메소드)를 대신 실행하는 객체

  -메소드를 호출하듯 사용한다.

  -단, 대리자가 실행할 코드는 컴파일 시점이 아닌 실행 시점에 결정

 

  *대리자의 선언과 사용

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

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

MyDelegate Callback;

Callback = new MyDelegate(Plus); //Callback 대리자를 이용하여 Plus 메소드를 호출
Console.WriteLine(Callback(3,4)); //7출력

Callback = new MyDelegate(Minus); //Callback 대리자를 이용하여 Minus 메소드를 호출
Console.WriteLine(Callback(7,4)); //3출력


// 메소드
int Plus(int a, int b){
	return a+b;
}

int Minus(int a, int b){
	return a-b;
}

 

 

2.익명 메소드

  -다른 코드 블록에서 재사용될 일이 없는 이름 없는 메소드

  -익명 메소드 구현절차

    1). 사전 정의된 대리자 형식(반환형식, 매구변수)에 맞춰 익명 메소드 작성

    2). 익명 메소드 정의시 delegate 키워드로 시작하며, 정의된 코드는 대리자 참조에 할당

    3). 익명 메소드를 할당받은 대리자 참조 호출

 

대리자참조 = delegate(매개변수_목록){ 
//익명 메소드 
}
public static void Main(){
	Calculate Calc;
    Calc = delegate (int a, int b){
    		return a+b;
    		}
    Console.WriteLine("3+4: {0}",Calc(3,4));
}

 

3.이벤트

  -C#에서 객체의 사건을 표현하는 형식

  -이벤트 처리기(Event Handler) : 이벤트 발생시 실행되는 메소드

  -동작 원리는 대리자와 유사하다. 이벤트는 외부에서 직접 호출 할 수 없다(객체의 은닉성 표현을 위해서)

  -대리자를 event 한정자를 수식하여 선언

 

  -이벤트와 이벤트 처리기의 선언

// 1. 대리자 선언
delegate void EventHandler (string message);

// 2. 클래스 내에 위에서 선언한 대리자 인스턴스를 event 한정자로 수식

class MyNotifier{
	public event EventHandler SomethingHappened; //SomethingHappened는 대리자 객체
    	public void DoSomething(int number){
    	int temp = number % 10;
        if (temp != 0 && temp % 3 ==0){
        	SomethingHappened(String.Format("{0}:짝", number));
        }
    }
}


class MainApp{
//3. 이벤트 처리기 작성
	static public void MyHandler(string message){ 
    	Console.WriteLine(message);
    }
//4. 클래스의 인스턴스 생성 및 해당 인스턴스의 이벤트에 처리기 등록
	static void Main(string[] args){
    	MyNotifier notifier = new MyNotifier();
        notifier.SomethingHappened += new EventHandler(MyHandler); //대리자에 MyHandler 메소드 등록
        for(int i=1; i< 30 ; i++){
        	notifier.DoSomething(i);
        }
    }
}

'3_c# > C#문법' 카테고리의 다른 글

C# LINQ  (0) 2024.12.29
C# 람다식  (0) 2024.11.20
C# 일반화 프로그래밍  (0) 2024.11.20
C# 배열, 컬렉션, 인덱서  (0) 2024.11.20
C# 프로퍼티  (1) 2024.11.20