프로그래밍 농장

델리게이트(delegate) / 대리자 [ Unity ] 본문

Unity

델리게이트(delegate) / 대리자 [ Unity ]

Tennessee201 2022. 7. 12.
728x90

- Delegate? 

: 대행하다 : 어떠한 기능을 목록에 추가해놓으면 여러분들의 기능을 대신 수행시켜준다. 

 

-> Delegate에 사용자가 수행시킬 기능 (함수. . )들을 리스트형식으로 넣어두고, 이를 델리게이트가 대신 수행시켜주는 방식이다. -> 이때는 포인터형식으로 내장되어있기에, 함수들의 주소값이 있다고 보면된다. 

 


 

기존 함수들을 전부 구현해놓고 하나씩 꺼내 사용하는 방식

 

아래와 같이 delegate 를 구현해놓은 함수와 같은 타입과 인자형식으로 만들어놓으면, Start() 에서 그냥 기존 함수를 대입만 해주면 된다. 


왜 사용할까?

버튼이 눌리면 아바타에 옷을 입힌다 👉 무기를 들게 한다. 👉 랜덤 메세지를 출력한다. 이런 과정들이 순차적으로 실행되게 하고 싶다면 버튼 눌리는 함수 내부에 각각의 기능들을 함수로 직접 실행시키면 되겠다. 즉 ButtonPressed() 함수 내부에서 직접 여러 함수들에게 인수를 넘겨 호출하는 방식이다. 그러나 이런 구현 방식의 문제점은 ButtonPressed() 함수 내부에서 함수들을 실행시키면서 일일이 매개 변수에게 인수를 넘겨야 하기 때문에 개발자가 실수를 할 확률도 커지고, 예를 들어 게임 로직 함수와 UI 관련 함수가 섞여 있으니 설계적으로 보기도 좋지 않은 등등.. 여러모로 아쉬운 부분들이 있다. 유니티의 경우 ButtonPressed() 이런 버튼 클릭시 실행시킬 함수는 유니티에서 제공되는 이벤트 함수이기 때문에 함수 내부에다가 버튼 클릭시 내가 원하는 함수들 직접 추가할 수도 없다. 유니티 제공 시스템 함수라서 수정 불가능.

 

만약 ButtonPressed() 함수에 위 과정의 각각의 기능을 실행하는 함수들 자체를 인자로 넘기고 ButtonPressed() 내에선 이게 어떤 함수인지 몰라도 되며 그저 실행만 시키면 될 뿐이라면 위와 같은 문제들이 해결될 것이다. 마치 실행 해야할 함수 포인터들만 ButtonPressed()에게 인자로 넘겨주고 ‘대신 실행 부탁드려요~’ 하는 것과 같다. 일일이 실행될 함수들을 나열하여 직접 호출하고 그 함수들에게 인자 직접 명시하여 넘기고.. 그런 과정이 필요가 없다. 델리게이트 딱 하나만 실행하면 되기 때문에! (등록은 다른데서 필요할 때마다 해두고)

 

이처럼 A 라는 함수를 호출할 때 B 라는 함수 자체를 (B 함수 포인터) 인수로 넘겨주고 A 함수 안에서 B 함수를 호출하는 상황에서 A 함수를 콜백 함수라고 한다.

 

이처럼 실행시킬 함수들을 그 자체로(함수 포인터로) delegate에게 넘겨주면 delegate는 이 함수들의 내용은 모르지만 그저 받은 함수 포인터들을 대신 실행시켜줄 뿐이다. (그래서 이름이 대리자)

 

reference : https://ansohxxn.github.io/c%20sharp/ch9-4/

728x90

'Unity' 카테고리의 다른 글

물리엔진  (0) 2022.07.22
Animator / Blending tree 구현 [ Unity ]  (0) 2022.07.14
유니티 이벤트 [ Unity ]  (0) 2022.07.11
Property [ Unity ]  (0) 2022.07.11
Override [ Unity ]  (0) 2022.07.11