강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

가나파이님의 프로필 이미지
가나파이

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Listener

Invoke의 역할이 이해가 가지 않습니다.

해결된 질문

작성

·

357

2

_onAcceptHandler.Invoke(args.AcceptSocket); 

이 코드가 어떤 일을 수행하는 것인지, 왜 필요한 것인지 잘 이해가 가지 않습니다... 

_onAcceptHandler가 args.AcceptSocket을 수행하도록 하는 것인가요?

답변 1

3

Rookiss님의 프로필 이미지
Rookiss
지식공유자

우선 Action과 delegate 문법을 잘 이해하고 계신 것이 맞을까요?
위 부분은 C++로 치면 함수 포인터, 혹은 std::function과 유사합니다.
기본적으로 멤버 변수로는 int, float, bool 같은 데이터를 담는게 일반적이지만,
경우에 따라 '함수' 그 자체도 인자로 받아주면 굉장히 유용한 경우가 많습니다.
예를 들어서 클라 연결이 들어오면, [    ] 함수를 호출 해주겠다!
라는 우리만의 규칙을 정한 다음, [    ] 함수만 바꿔치기 할 수 있다면
[클라가 연결이 들어올 때 어떻게 처리할 것인지] 라는
서버 정책을 나중에 정할 수 있게 됩니다.
즉 [   ] 함수를 인자로 받아서, 그 부분을 호출하는 식으로 만들어주면 되는 것이고
이게 바로 콜백 함수의 장점이자 _onAcceptHandler의 역할입니다.


즉, 위와 같이 클라가 연결하면 호출할 함수를 인자로 받아주는 것이죠.
굳이 ServerCore에서 바로 처리하지 않고,
처리할 함수를 따로 받아주는 이유는
나중에 컨텐츠 단에서 이것을 유연하게 정할 수 있도록 하기 위함입니다.

Action<Socket> 으로 변수를 만들어 주면,
사실상 void를 리턴하고 Socket을 인자로 받아주는 그 어떤 함수도 호환이 됩니다.

void Test(Socket socket);  // < OK
void Hello(Socket socket);  // < OK
void Sorry(); // << NO ! 함수 시그니처가 다름

참고로 C++로 치면 std::function<void(Socket)> 혹은 void(*)(Socket)에 해당합니다.

가나파이님의 프로필 이미지
가나파이
질문자

그러면

_onAcceptHandler.Invoke(args.AcceptSocket); 

이 부분은 accept된 클라이언트가 있으면 앞에 핸들러에 등록한 함수들을 실행하는 부분인 것이죠?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 맞습니다!

가나파이님의 프로필 이미지
가나파이
질문자

답변 정말 감사드립니다 ㅎㅎ 

가나파이님의 프로필 이미지
가나파이

작성한 질문수

질문하기