해결된 질문
20.09.12 14:58 작성
·
290
1
FlyableOrc orc = new FlyableOrc();
DoFly(orc);
를 메인함수에 작성을 하고
DoFly() 함수 안에서 flyable.Fly(); 를 호출하셨는데
그럼 FlyableOrc라는 몬스터는 Fly 속성 두개를 가지고 있는건가요?
인터페이스 함수안에 있는 Fly()와 FlyableOrc 클래스에 있는 Fly()
orc.Fly(); 와 DoFly(orc);의 차이점이 궁금합니다.
답변 3
5
2020. 09. 12. 17:44
답변 감사합니다.
제가 이해한 것이 맞는지 확인하기 위해 추가적으로 질문을 드립니다.
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
2020. 09. 12. 15:54
굉장히 헷갈리는 부분인데,
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
2020. 09. 12. 18:32
네 맞습니다 !
물론 FlyableSkeleton도 IFlyable 인터페이스로 인해
Fly를 정의했을테니 Fly를 호출은 할 수 있겠지만,
FlyableOrc의 Fly와는 다른 기능을 하겠죠.