본문 바로가기
C#

델리게이트

by imagineer_jinny 2021. 7. 20.

델리게이트: 어떠한 기능을 목록에 추가해두면 델리게이트가 기능들을 대신 발동시켜줌.

1) 대신해줄 친구의 서식을 명시하고 

2) 그러한 델리게이트 타입의 변수를 새로 만들어준 다음,

3) 대행해줄 친구를 명단에 등록!

4) 그 다음에 그 친구를 발동만 시켜주면 됨!

 

상황: Calculator 오브젝트를 만들어보자

 

<델리게이트 없을 때>

Update()함수에서 어떤 계산을 할지 명시를 해줘야 함.

즉 계산기가 어떤 계산을 할지 계산 하는 순간에 알고 있어야 함.

이 방법의 단점은 계산하고 싶은게 달라졌을 때 Update안의 코드를 바꾸지 않는 이상 변경사항을 적용할 수 없음 

 

<어떻게 바꾸고 싶은가?> 

Update 안에는 코드 바꿀 필요 없이 계산 한다는 것만 명시해주고 계산의 내용은 실시간으로 바꿀 수 있게

 

<해결: 델리게이트>

어떤 사람이 죽기 전에 유언 리스트에다 자기가 하고 싶은걸 적고 죽음.

그럼 유언대리인은 유언리스트에 어떤친구들이 있는지 신경쓰지 않고 단지 내용물들을 수행만 함. 

 

-델리게이트는 어떤 기능을 리스트에다 등록을 하고 그 등록된 기능들을 대행해주는 친구.

단, 여기엔 서식이 있어서 맞는 서식을 갖지 않은 함수는 필터링을 하는 기능이 들어있음.

그래서 델리게이트형을 선언함!

델리게이트는 내부에 함수 포인터를 가지고 있음. 정확히 말하면 A,B,C라는 함수들이 delegate에 자신을 등록한다는게 무슨말이냐면 delegate가 A,B,C를 가리키는 변수를 가지고 있다는 얘기임.

delegate는 A,B,C라는 명단을 기록해두고 delegate가 발동되는 순간 화살표들을 찾아가서(기능이 있는 곳까지 찾아가서) A,B,C를 발동시키는 것임.

delegate는 대신 실행시킬 친구들의 집주소가 적혀있음.

<델리게이트 적용> 

변수를 만드는게 아니라 델리게이트 형을 새로 하나 정의하는 것임!

새로운 함수나 변수를 만든게 아니라 새로운 델리게이트를 정의한 것임.

 

- Calculate 형의 델리게이트는 float형의 숫자를 리턴하고 float이란 숫자 두개를 입력으로 받는

함수만 대행해줄 수 있다는 얘기임.

즉 이 친구는 앞으로 탄생될 델리게이트들의 원형이 되고, Calculate 형태의 델리게이트는 입력을 두 개 받고 

출력을 float 형태로 하는 함수를 대리해줄 수 있음(1)

Calculate 타입의 새로운 델리게이트 변수 onCalculate(2)

게임이 시작되었을 때 onCalculate에 대신해줄 친구들을 등록

이때 onCalculate = Sum( ) 이런식으로 괄호를 사용하지 않음

실행하는 부분에서 괄호를 붙인단 얘기는 이 친구를 실제로 사용한단 얘기. 

( ) 를 붙이면 Sum을 호출한다는 얘기.

 

괄호를 안붙이면 Sum이란 친구를 명부에 등록을 하는거지 Sum 자체를 발동시킨단 얘기는 아님

 

Sum을 onCalculate가 가리키면서 대행해줄 것임.

 

이제 Update에서 onCalculate를 발동만 시켜주면 됨

발동시켜줄 때 입력을 넣어줌

사실 Sum(1,10)이 발동이 되는 것

 

결과값 반환도 가능

 

추가적으로 덧붙일수도 있음

 

기존에 명단에 있던 것 뺄 수도 있음

 

유의할 점:

onCalculate가 자신이 대행해준 친구의 결과값을 챙겨오는데 밑에처럼 한번에 여러개를 대행해주면

마지막으로 추가된 친구의 결과값만 대신 가져옴.

(여러개를 동시에 대행해도 여러개의 값을 동시에 리턴할 수 없으니까) 

Multiply의 결과값만 가져옴

'C#' 카테고리의 다른 글

액션 + 람다 함수  (0) 2021.07.21
이벤트  (0) 2021.07.21
유니티 이벤트  (0) 2021.07.20
프로퍼티  (0) 2021.07.19
추상 클래스  (0) 2021.07.19

댓글