해결된 질문
작성
·
357
답변 1
3
우선 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된 클라이언트가 있으면 앞에 핸들러에 등록한 함수들을 실행하는 부분인 것이죠?