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

DSK님의 프로필 이미지
DSK

작성한 질문수

[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작

ObjectManager

가상함수 오버라이드 시 함수호출순서

해결된 질문

작성

·

622

1

안녕하세요, BaseController의 Init() 함수 관련 질문드립니다. 예전 강의에 대한 질문이라 기억하실지 모르겠네요ㅠ

BaseController - CreatureController - MonsterController 상속관계가 있는 상황에서, BaseController 내 virtual Init() 가상함수를 만들고 Awake() 내부에 Init()을 호출하도록 코드를 작성하셨습니다.

이때 CreatureController와 MonsterController 모두 Init()함수를 오버라이드한 상태입니다.

이때 가상함수의 함수호출순서가 궁금해서 디버깅해봤는데, MonsterController 생성시 BaseController의 Awake()에 가장 먼저 진입하고, Init() 함수를 호출하는데, 이때 프로그램 다음 실행흐름이 BaseController내부에 virtual로 작성한 Init()함수가 아니라 MonsterController에 override한 Init()함수를 실행하는것이 이해가 안됩니다.

BaseController내부 awake()에서 Init()을 호출하면 당연히 같은 클래스인 BaseController의 Init()을 호출하고 끝내야 할것으로 예상했는데, MonsterController의 Init()을 호출한다 게 잘 납득이 안됩니다.

추가설명을 조금 해주실 수 있으실까요?

답변 1

2

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

가상함수 (virtual)는 C#, C++ 등 프로그래밍 언어 공통적인 부분이라
반드시 잘 이해를 하셔야 합니다.
이 함수들은 '원본 객체'가 어떤 타입으로 만들어졌는지에 따라
해당 객체 타입의 함수를 호출합니다.
예를 들어 Knight가 Player를 상속 받는 상태에서,
Player p = new Knight();
위와 같은 코드를 이용해 객체 원본은 Knight로 만들되, Player 타입의 변수로 관리하더라도
p.가상함수(); 를 호출하면 Knight의 함수가 호출되는 것이죠.

이 부분은 OOP에서 다형성의 가장 핵심적인 내용이니 꼭x100 이해를 하고 넘어가셔야 합니다.

DSK님의 프로필 이미지
DSK

작성한 질문수

질문하기