버그 해결을 위한 모든 질문을 던져
+1 vote
171 views
유니티를 주로 하며 C#를 주 언어로 사용하고 있습니다. 입사한지 2주된 신입분께서 질문하시기를, abstract class 의 abstract method 는 호출이 가능하다고 얘기 할 수 있는가에 대한 것이었습니다. 저는 제 생각대로 추상클래스는 독자적으로 인스턴스화가 불가능할 뿐, 인스턴스화만 된다면 얼마든지 호출가능하다고 답변했습니다.

abstract class 내 virtual method나 일반메서드 에서 abstract method 도 호출을 하니까요.

 

그런데 본인은 그렇게 배우지 않아서 아직도 헷갈린다고 얘기를 해줘서, 일주일째 점심먹을 때 마다 생각이 납니다. msdn 검색도 해보고 책도 뒤적거려보고 했는데, 명확한 결론을 내리지 못했네요. 저는 이런 식의 condition이 많이 붙는 애매한 tf에 대해 배워본적이 없는 것 같습니다.

 

잘못 대답해준게 아닌가 계속 마음에 걸려서, 제가 제대로 답변한 것이 맞나요?
asked (37 point) , 171 views

1 답변

+3 votes
우수 답변
제 생각에는 신입 분의 질문이 추상적이어서 유니티엔진 님의 답변도 추상적일 수 밖에 없을 것 같습니다. 거기서 오는 스트레스 때문에 신경 쓰이시는 것 같네요. 적절하게 잘 답해주신 것 같습니다. ㅎㅎ

 

좀 더 마음 편히 가지시라고 제 나름의 풀이를 아래에 주절주절 늘어 놓겠습니다. 두 가지 관점에서 접근해서 결론을 도출했습니다.

 

1. 컴파일 이후 기계어 차원에서 abstract 키워드가 붙은 함수의 동작에서의 관점

2. MS가 제시하는 C#에서의 클래스와 abstract 키워드에 대한 개념에서의 관점

 

우선 1번의 경우는 조금 애매합니다. 어셈블리 코드에서는 class란 개념이 생존하고 있지 않으니까요. 어딘가에 등록 된 override 된 함수를 콜해서 호출하게 될겁니다. 하물며 부모 클래스여야만 하는 추상 클래스의 추상 메소드는 어떨까요? 1번 관점에서는 엄밀한 의미에서는 abstract class 의 abstract method 는 호출이 불가능하다라고 말해야 할 것입니다.

 

그렇다면 2번 관점은 어떨까요?

 

 MSDN에서의 C# Class는 부모 클래스는 자식 클래스가 inherit 한다고 표기되어 있습니다. 해당 표기를 국문 MSDN에선 전이한다고 표현하고 있죠. 그리고 우린 이걸 흔히 '상속'한다고 표현합니다.

 

abstract 메소드는 자식 클래스에서 구현이 될 것을 강제하고 있습니다. 왜냐하면 부모 클래스인 추상 클래스에선 본문(함수 내용)이 없기 때문입니다. 이는 함수 뿐만이 아니라 추상 프로퍼티도 마찬가지입니다. 없는 것을 호출 할 수는 없죠.

 

여기까지만 보면 abstract 메소드는 호출이 가능하다고 말할 수 있는가에 대한 질문에 대한 답변은 No로 기울게 됩니다. 하지만 신입 분의 질문 자체에 숨어 있는 오류와 추상성을 간과 할 수도 없습니다.

 

abstract class는 애초에 단독으로 사용하는 것이 문법적 오류입니다. abstract class는 자식 클래스 단에서 '반드시' abstract 메소드 혹은 프로퍼티의 구현을 제공하도록 문법적으로 강제하고 있죠.

 

그리고 우리가 abstract class의 abstract method를 '호출'한다고 하는 행위에 대한 일반적인 기대는 각 자식 클래스 별로 구현 된 method를 호출하는 것입니다. 말씀하신 것처럼 심지어 abstract class 내에서도 abstract method를 직접 호출하는 경우 앞서 말한 것처럼 실행되게 계획 된 키워드니까요.

 

그러니 정리하자면 말씀하신 것처럼.

 

추상클래스는 독자적으로 인스턴스화가 불가능할 뿐, 인스턴스화만 된다면 얼마든지 호출 가능하다고 말하는 것이 적절해 보입니다. 바로 그 것이 abstract 함수의 설계 의도니까요.
answered (53 point)
선택됨

상세한 답변 감사드립니다.

많은 도움이 되었습니다. yes

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

358 질문
479 answers
485 댓글
1,890 users