안녕하세요!
게임개발자가 되기위해 공부하는 구구입니다.
오늘은 C#의 델리게이트와 이벤트에 대해 알아보도록 하겠습니다.
- 델리게이트(Delegate)
접근제한자 delegate 리턴형 식별자(파라미터); //식별자 = 함수이름
ex) public delegate int DelgateFunc(int a);
- 대리자(메소드 참조형)
- 메소드의 틀을 만들어 소통
- 클래스간 통신에 활용
- delegate의 타입과 메소드의 타입이 일치할때 delegate할당이 가능
- 선언시 클래스와 같은 위치
- Delegate도 일반화(<T>) 가능
- Delecate 인스턴스화
- Delegate 타입의 참조변수를 선언하고 메소드 할당
ex) DelegateFunc delegateFunc = new DelegateFunc(Add);
- Delegate 호출
- 생성한 인스턴스를 이용해서 메소드 호출
ex) delegateFunc(10);
delegate를 통해 Add를 간접적으로 호출한 모습을 볼 수 있다.
- 선언 방법
1 : 기본 선언
DelegateTest dt = new DelegateTest(Sum);
2 : 간략한 선언
DelegateTest dt2 = Sum;
3 : 익명 함수 선언
DelegateTest dt3 = delegate (int a, int b) {
Console.WriteLine("a + b = " + (a + b));
};
//sum이란 함수를 쓰지 않고도 쓰면서 바로 함수가 어떤 것을 수행하는지를 함께 정의해버림
4 : 람다식 선언
DelegateTest dt4 = (a, b) => {
Console.WriteLine("a + b = " + (a + b));
};
우선 각각의 방법으로 dt, dt2, dt3, dt4를 선언하고 이를 실행시켜보았습니다.
그리고 그 다음 익명함수 선언 방법으로 dt를 다시 재정의하고 사용하였습니다.
- delegate 함수 파라미터 활용
- 일반적으로 자주 사용됨.
- 함수를 파라미터로 받을 수 있음.
delegate void delegateFunc();
class MessageProcess
{
delegateFunc CallOkFunc;
delegateFunc CallCancelFunc;
public void Message(string msg, delegateFunc okFunc, delegateFunc cancelFunc)
※CallBack(콜백)
어떠한 A메소드를 호출할 때, B라는 메소드를 매개변수로 넘겨주고 A메소드에서 B메소드를 호출하는것.
이때, A메소드를 '콜백 메소드'라 부름.
- 다중 캐스트 Delegate
- 대리자 하나로 여러개의 메소드를 동시에 참조할 수 있는 것
- 추가는 '+='연산자, 제거는 '-='연산자를 이용한다.
Subtract는 파라미터가 2개이기 때문에 cal이 인스턴스화 하는것은 불가능하다.
파라미터가 1개인 Add와 PrintMyNumber만 인스턴스화 가능한데 이 2개를 한번에 cal 안에 집어넣으면 집어넣은 순서대로 실행이 될 것이다.
+=을 이용해서 더 추가할수도 있고 -=을 이용해서 기존에 존재하는 함수를 제거도 가능하다.
- 이벤트(event)
- 클래스 내에서 특정한 상황 발생시 외부에 알리는 기능
- 발행자(이벤트를 발생시키는 객체)와 구독자(이벤트를 처리하는 객체)로 구성
- 델리게이트를 사용 후 이벤트 사용 가능
- 델리게이트와의 차이점
- 할당 연산자(=) 사용불가
- 클래스 외부 호출 불가(안정성 증가)
- 클래스 멤버 필드에서 사용
- 이벤트 선언방법
- Delegate 선언
- Delegate 타입의 이벤트 선언
- 이벤트 호출
- 이벤트 발행자 객체 생성
- 이벤트 핸들러 등록(이벤트 발생시 어떠한 명령을 수행할지 지정해주는 것)
- 이벤트 발생
아래사진의 해석은 위의 이벤트선언방법과 비교하기 쉽게 이번에만 사진 위에서 해석해보도록 하겠습니다.
이벤트 선언 방법에 맞춰서 한번 분석해보겠습니다.
1. public delegate void delegateEvent(string msg);
2. public event delegateEvent myEvent;
3. public void DoEvent(int a, int b) {
if(null != myEvent) // 이벤트 게시자 유무 체크, null값이면 이벤트x (엄청 자주 쓰임)
myEvent("DoEvent: " + (a + b)); //== ConsoleFunc("DoEvent: " + (a + b)); // 이벤트 발생
}
4. InDelegate id = new InDelegate();
5. id.myEvent += ConsoleFunc; //id.myEvent += new delegateEvent(ConsoleFunc); 와 똑같음
6. id.DoEvent(i+1, i+2);
오늘은 여기까지 하도록 하겠습니다.
'게임 개발 공부 > C#' 카테고리의 다른 글
C# LINQ (0) | 2021.12.24 |
---|---|
C# 람다식 (0) | 2021.12.23 |
C# 예외 처리 (0) | 2021.12.21 |
C# 일반화 프로그래밍 2 (0) | 2021.12.20 |
C# 일반화 프로그래밍 1 (0) | 2021.12.19 |
댓글