본문 바로가기
Swfit

super.viewDidLoad를 호출하는 이유

by GGShin 2024. 3. 21.

ViewController를 만들 때 기본적으로 구현되어 있는 코드이기 때문에 아무런 생각 없이 호출하던 super.viewDidLoad().

왜 꼭 호출해야 하는 것인지 문득 궁금해져서 알아보게 되었습니다. (viewDidLoad로 특정지었지만 viewWillAppear나 viewDidAppear 등등 여러 override 메서드들에 모두 해당되는 이야기입니다.)

 

SO에도 몇몇 해당 질문들이 있었는데, 'super.viewDidLoad() 메서드를 호출하지 않아도 아무런 문제가 없고 호출했을 때와 차이가 없다. 그런데 왜 꼭 호출을 해야하는가?'를 문의하는 글들이었습니다. 그 중에 가장 저에게 와닿았던 답변은 이러했습니다.

 

Also, let's say you have some view controller that inherits from UIViewController and doesn't call super for viewDidLoad. A couple of months later you decide you want it to inherit from some different ViewController that does some stuff in viewDidLoad. Your code will break in mysterious ways. We don't call super so we don't forget to call it when needed, we call it to protect our code in case of change. -tsp

 

super.viewDidLoad()를 구현하지 않는다고 해서 문제가 일어나는 것은 아니고, 추후에 애플이 해당 메소드를 호출하지 않는 앱들에 문제가 일어나도록 viewDidLoad 내부 로직을 변경할 것 같지도 않다. 하지만 예를 들어서 이미 구현해 놓은 ViewController의 viewDidLoad에 새로운 로직을 추가하게 되었는데, 해당 VC를 상속하는 Child에서 super.viewDidLoad()를 호출하지 않았다면 생각지 못한 이슈가 일어날 수도 있을 것이다. 그렇기 때문에 추후에 생길 수 있는 문제에 대비하기 위해서라도 super.viewDidLoad()를 호출하는 것이 좋다. 

 

개인적으로도 중복되는 코드를 조금이라도 줄이고자 모든 ViewController에서 수행하기 원하는 기능들을 BaseViewController에 구현하고 ViewController들이 상속 받도록 하고는 합니다. 이 BaseVC의 viewDidLoad에 특정 기능들을 구현해 놓고, child에서 이를 호출하지 않는다면, 의미가 없어지게 됩니다. 

 

물론, 또 반대로 child에서는 호출되기 원하지 않는 기능들이 구현되어 있으면 안 될테니 주의를 해야하겠습니다. (이와 관련해서는 어떻게 처리를 하는 것이 좋을지 궁금합니다.)

 

또, loadView()는 super.loadView()를 직접적으로 호출하면 안된다고 명시되어 있습니다. 이를 근거로 loadView()와 같이 특별하게 주의를 주는 경우가 아니라면 기본적으로 super를 호출해 주는 것이 맞지 않는가 라는 의견도 있었습니다. 

 

확실한 증거(?)가 있는 건 아니지만, 기본적으로 호출을 하되 super 호출의 영향력을 염두에 두어야 겠다는 생각을 하게 되었습니다.


참고자료

https://stackoverflow.com/questions/40151723/why-when-do-we-have-to-call-super-viewdidload

 

Why/when do we have to call super.ViewDidLoad?

Everyone tells me "Use super.viewDidLoad() because it's just like that" or "I've been doing it always like that, so keep it", "It's wrong if you don't call super", etc. override func viewDidLoad()...

stackoverflow.com

 

반응형