• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Fly()와 DoFly()

20.09.12 14:58 작성 조회수 196

1

FlyableOrc orc = new FlyableOrc();

DoFly(orc);

를 메인함수에 작성을 하고 

DoFly() 함수 안에서 flyable.Fly(); 를 호출하셨는데

그럼 FlyableOrc라는 몬스터는 Fly 속성 두개를 가지고 있는건가요?

인터페이스 함수안에 있는 Fly()와 FlyableOrc 클래스에 있는 Fly()

orc.Fly(); 와 DoFly(orc);의 차이점이 궁금합니다.

답변 3

·

답변을 작성해보세요.

5

답변 감사합니다.

제가 이해한 것이 맞는지 확인하기 위해 추가적으로 질문을 드립니다.

orc.Fly()는 orc만이 쓸 수 있는 함수이고

static void DoFly(IFlyable flyable)

{

    flyable.Fly();

}

를 따로 작성한 것은

IFlyable 속성을 가지고 있는 다른 몬스터들도 날게 할 수 있어서 범용성을 지니고 있다는 말씀이신거죠?

예를들면,

class FlyableSkeleton : Skeleton, IFlyable

{

}

을 추가하고

메인함수 안에서 

FlyableOrc orc = new FlyableOrc();

FlyableSkeleton skeleton = new FlyableSkeleton();

DoFly(orc);

DoFly(skeleton);

4

굉장히 헷갈리는 부분인데,
Interface 문법과는 크게 관계가 없고
static 함수 vs non-static 함수가 관건입니다.

static이 붙지 않으면 특정 객체에 의존적인 함수이고,
객체에 의존적이기 때문에 orc.Fly()와 같이 [객체].함수() 형태로 사용하게 됩니다.
그리고 내부에서는 그 객체의 정보를 꺼내 사용할 수 있죠.
스타크래프트 Marine이 데미지를 받는 부분을 처리하는 OnDamaged 함수가 있다면,
각 마린마다 체력이 다를테니 non-static으로 만들고
marine.OnDamaged(damage)를 호출하여, 
내부에서 해당 마린의 체력을 깎아야겠죠. (hp -= damage)

static이 붙으면 특정 객체와 무관하니,
함수 인자만 맞으면 어디서나 사용할 수 있습니다.
반대로 그렇다는 얘기는 non-static 함수와는 다르게
특정 객체의 정보에 바로 접근을 할 수 없습니다.
마린의 공방업을 담당하는 Upgrade 함수가 있다고 하면,
그 업그레이드 수치는 특정 마린한테만 적용되는게 아니니,
Marine클래스 내부의 static 함수로 만들어서
공유하는 공방업 수치를 증가 시키면 되겠죠.

굉장히 미묘한데 결과적으로
orc.DoFly()나 DoFly() { hp -= 10; } 같은 호출은 불가능합니다.

orc.DoFly() // 특정 객체에 묶인 함수가 아니라 안됨 (static)
DoFly() { hp -= 10; } // 누구의 hp인지 알 수가 없으니 안됨

이걸 약간 짬뽕한게 DoFly(IFlyable orc)인데,
DoFly(orc) 호출하면서 orc를 DoFly의 인자로 넣어줬으니,
static의 조건인 [누구나 인자만 맞으면 호출 가능]한 것도 통과 되었고,
내부적으로 다시 orc.Fly()를 호출해서
non-static의 조건인 [누구를 대상으로 Fly() 호출할지도 알기] 때문이죠.

2

네 맞습니다 !
물론 FlyableSkeleton도 IFlyable 인터페이스로 인해
Fly를 정의했을테니 Fly를 호출은 할 수 있겠지만,
FlyableOrc의 Fly와는 다른 기능을 하겠죠.