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

작성자 없음

작성자 정보가 삭제된 글입니다.

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

Connector

캐스팅 질문 드려요.

해결된 질문

20.06.29 14:51 작성

·

234

3

Connect 구현 중에 캐스팅 코드관련해서 궁금한 것이 있습니다.

명시적 캐스팅을 진행할 때

Socket socket = (Socket) args.UserToken;

이렇게 진행한다고 배웠는데

Socket socket = args.UserToken as Socket;

as 키워드로 하는 캐스팅이 나와 당황스러웠어요.

둘 차이점이 있나요?

답변 4

4

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

2020. 06. 29. 20:00

ㅎㅎㅎ 당황하실건 없고 그냥 아주 약간 차이가 있습니다.
(Socket) 요렇게 캐스팅하는게 가장 일반적인데
이 경우 Socket으로 캐스팅 될 수 없으면 Exception이 나면서 크래시가 납니다.
(as Socket) 형태는 C++의 dyamic_cast와 유사한데,
캐스팅이 안 된다면 null을 반환한다는 특징이 있습니다.
사실 지금은 Socket 타입인 것을 100% 확신할 수 있으니
(Socket) 이렇게 하는게 성능상 아주 조금 낫긴 합니다.

2

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

2020. 06. 30. 19:53

네 약간의 차이는 있지만 선택의 영역이라 볼 수 있습니다.

다만 상속 관계에서 특정 타입에만 코드를 적용하고 싶을 때라면,
의도적으로 (as)를 이용해서 확인하는게 유용할 수도 있습니다.
예를 들어 class Monster : Object, class Player : Object로 정의된 상태에서,
처치한 Object가 Player인 경우에만 PvP 포인트를 주고 싶다면,

Player p = obj as Player;
if (p != null)
   AddPvpPoint(...);

형태로 만들 수가 있겠죠.

0

장민창님의 프로필 이미지

2020. 07. 01. 15:22

감사합니다!!!!!!

0

장민창님의 프로필 이미지

2020. 06. 30. 09:43

감사해요! 모호하던것들이 점점 명확해져 가는 기분입니다.

그러면 상속을 받거나 구현체의 경우 Method에 where를 걸지 않는다면 as 키워드로 캐스팅을 하고

where를 걸었을 경우엔 () 괄호로 캐스팅 하는것이 안전할 것 같다는 생각이 드는데

이건 어디까지나 선택의 방법이겠죠?

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기