C# 델리게이트&이벤트
본문 바로가기
  • 게임 개발자가 되고싶은 구구
게임 개발 공부/C#

C# 델리게이트&이벤트

by gugu99 2021. 12. 22.
반응형

안녕하세요!

 

게임개발자가 되기위해 공부하는 구구입니다.

오늘은 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)

- 클래스 내에서 특정한 상황 발생시 외부에 알리는 기능

- 발행자(이벤트를 발생시키는 객체)와 구독자(이벤트를 처리하는 객체)로 구성

- 델리게이트를 사용 후 이벤트 사용 가능

- 델리게이트와의 차이점

  1. 할당 연산자(=) 사용불가
  2. 클래스 외부 호출 불가(안정성 증가)
  3. 클래스 멤버 필드에서 사용

 

  • 이벤트 선언방법
  1. Delegate 선언
  2. Delegate 타입의 이벤트 선언
  3. 이벤트 호출
  4. 이벤트 발행자 객체 생성
  5. 이벤트 핸들러 등록(이벤트 발생시 어떠한 명령을 수행할지 지정해주는 것)
  6. 이벤트 발생

 

아래사진의 해석은 위의 이벤트선언방법과 비교하기 쉽게 이번에만 사진 위에서 해석해보도록 하겠습니다.

이벤트 선언 방법에 맞춰서 한번 분석해보겠습니다.

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

댓글