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

이창현님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

Scene Manager #1

부모클래스에서 Init()을 실행하는 부분 질문입니다.

20.06.14 19:46 작성

·

1K

0

안녕하세요

게임오브젝트를 비활성화 시켜도 Awake() 안에있는 Init()은 실행된다는 것은 이해했는데요 

14분 44초에서 부모 클래스 BaseScene.cs에서 Init()을 실행했는데 어떻게 자식클래스 GameScene.cs의 Init()까지 실행이되는건지 잘 이해가 안됩니다. 제 생각으로는 자식클래스에서 어떤 메서드를 오버라이드했더라도 부모클래스에서 그 메서드를 실행하면 부모클래스의 메서드만 실행될거같은데 유니티에서만 가능한건가요? 

답변 5

5

leomessi님의 프로필 이미지

2020. 08. 06. 23:34

저도 이 문제로 고민을 많이 했었는데요,

구글에 '객체 묵시적 형변환' 이라고 검색해보시면 언어는 비록 Java로 많이 소개되어있지만 이거랑 비슷한 개념을 설명하고 있는 곳이 많으니 확인해보시는 것도 좋을 것 같습니다.

5

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

2020. 06. 14. 20:06

안녕하세요,
굉장히 중요한 부분인데 혼동을 하시는거 같네요.

함수를 어디서 호출했는지는 딱히 상관이 없고,
정말로 객체 자체가 어떤 타입으로 처음에 생성 되었는지가 중요합니다.

3

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

2020. 06. 14. 21:35

Init()메서드로 인해서 부모클래스 타입으로 GameScene객체가 생성되고 <<
이건 절대 아닙니다! 내부적으로 새로 뭔가를 만드는 것은 아니고,
어떤 객체의 가상 함수를 호출하면 가상 함수 특성상,
가상 함수 테이블을 참조해서 override 된 함수가 있으면 그 버전으로 호출하게 됩니다.

3

이창현님의 프로필 이미지
이창현
질문자

2020. 06. 14. 21:01

저도 저런식으로 따로 테스트 해보긴 했는데 BaseScene.cs의 Awake()에서 실행한 Init()이 

Creature c = new Creature();

c.Test();

이런식으로 실행되는거라고 생각해버렸네요. 

그럼 유니티 내부적으로 

BaseScene b = new GameScene();

b.Init();

이렇게 실행되는 것으로 이해하면 되는건가요? 뭔가 GameScene은 Start()나 Awake()메서드도 없는데 부모클래스의 Awake()메서드 안에서 실행한 Init()메서드로 인해서 부모클래스 타입으로 GameScene객체가 생성되고  Init()이 실행된다는게 어렵네요.

다형성 부분이 공부가 아직 부족한것같습니다.

항상 친절하고 빠른 답변 감사합니다!

0

박정민님의 프로필 이미지

2023. 08. 02. 22:48

  1. 하이어라키에 생성되는 @Scene : GameScene 컴포넌트

  2. GameScene은 BaseScene(부모클래스)의 의지를 이음.

  3. @Scene이 GameScene을 사용하므로 override된 GameScene의 Init()을 사용한다는 거군요