작성
·
45
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요.. 최근 iOS 앱 개발 강의를 따라 하고 있는 중입니다.
그런데, 갑자기 의문이 생겼습니다.
ViewController의 코드에서
override func viewDidLoad(){
super.viewDidLoad()
//
}
로 함수 내부에서 super.viewDidLoad()를 호출해 주는데,
세그웨이 를 위해서 override하는 함수 prepare에서는 왜 super.prepare()라는 함수를 호출해 주지 않는 것인가요?
함수를 override 할 때 super의 함수를 override 하는 것은 UI 표시 관련된 함수만 호출하는 건가요? 일종의 동작관련한 것들은 override 함수에서 super의 함수를 호출할 필요가 없나요?
답변 2
0
네 안녕하세요 산마로 님!
클래스의 메서드의 재정의에 대해 질문을 주셨는데, 더 본질적인 답변을 드려보자면.. 하위 클래스에서 재정의를 하면서 상위 클래스의 메서드를 호출하는 경우는.. 일반적으로 어떤 동작 과정이 상위에서 반드시 일어나야 하기 때문입니다. (어떤 숨어 있는 동작과정을 반드시 할 필요가 없는 경우는 당연히 호출할 필요가 없는 것이고요. )
그런데, 일반적으로 애플이 만들어놓은 스토리보드라던지.. 뷰를 호출하는 과정 내부에는 우리 눈에 보이지 않는 내부적인 메커니즘들이 많이 숨겨져 있습니다. 따라서, 우리가 처음부터 모든 것을 알 수 없고(외울 수 없고) 애플의 공식문서(결국 UIKit 설명서)에서 그때 그때마다 확인을 하는 것이 정답이긴 합니다.
그런데 애플 공식문서 viewDidLoad에서..
https://developer.apple.com/documentation/uikit/uiviewcontroller/viewdidload()
정확하게, 현재는 super.viewDidLoad를 호출해줘야 한다는 말이 실제 공식문서에서 없어지긴 했는데.. 예전 공식문서에서는..
Discussion
Typically, your override would perform one-time instantiation and initialization of the contents of the view controller’s view. If you override this method, call this method on super at some point in your implementation in case a superclass also overrides this method.
실제 위와 같이 쓰여져 있었습니다. (위의 내용은 현재 공식 문서에서 사라졌지만.. 블로그 글 등을 찾아보시면 나오는 내용입니다.)
위의 내용이 실제 공식 문서에서 사라졌기(바뀌었기) 때문에.. super.viewDidLoad를 호출해주지 않아도 크게 문제가 생기진 않을 것 같지만 (제 뇌피셜), 일반적으로 뷰를 생성하는 과정 등은 복잡한 과정이 얽혀있고, UIKit의 내부 구현 같은 것들이 조금씩 바뀌고 있기 때문에.. 어떤 향후 또 바뀔지도 모르는 안전성을 보장하기 위해서는 호출해 주는게 맞다고 보이긴 합니다.
(예전에는 호출하라고 공식문서에 쓰여져 있었는데, 없어진게 저도 의문이긴 하네요.)
(예를 들어, UIViewController에는 @MainActor 이런게 안 붙어 있었는데, Swift Concurrency 때문에 붙기도 했죠. 여러가지로 프레임워크는 OS의 업데이트나 새로운 기술이 생기면 내부 구현들이 조금씩 바뀌고 업데이트 되고 있습니다.)
그래서, 결론적으로는
일반적으로 모든 UIKit 메서드의 경우 재정의를 할때는.. 애플 공식 문서를 확인해보는 것이 정답입니다.
그래서 또 추가적으로 질문주신 seque의 prepare메서드로 공식문서에서 확인해보시면
https://developer.apple.com/documentation/uikit/uiviewcontroller/prepare(for:sender:)
재정의할때 상위 메서드를 호출하라는 말이 없습니다.
(그래서 안 붙여줘도 되는 것이고요.)
원칙적으로는, 처음 공부하실 때는 정확성 확인 차원에서 일일이 공식문서를 확인해보시는 것이 정답이고, 나중에 익숙해지시면.. 당연히 여러번 사용해 보았으니까 외워서 사용하게 되는 것이겠지요.
다만, 어느정도 익숙해지시면.. 약간 직관적(또는 감각적..)으로 알게 되시는 것이.. 메서드의 구현 성질을 보시면.. 상위 메서드에서 어떤 일을 반드시 해야할지 / 안 해도 될지 어느정도 감각적으로 알 수는 있습니다. viewDidLoad와 같이.. 뭔가 초기화나 생성과정에 관여하고, 뷰에 관련된 성질은.. 일반적으로 "내부적인 메커니즘이 숨겨져 있는 경우가 많기 때문에" 상위(super) 메서드를 호출하는 경우가 많습니다.
(상위에서 어떤 중요한 일들이 일어나야 하는 경우가 많습니다.)
그리고 질문주신 prepare 같은 메서드의 성질을 보시면.. 실제 구현 내용이.. 내가 구현하는 prepare메서드 안에서 직접적인 일처리를 위한 구현에만 관여되어 있다는 것이 보이기 때문에.. super에서 할일이 없겠구나.. 라고 직관적으로 조금 예상은 되는 것이지요.
추가적으로 아래와 같은 글들도 참고해보셔도 될 것 같습니다. :)
https://ittingz.tistory.com/260
https://nlestory.tistory.com/214
고맙습니다 :)
0
안녕하세요, 인프런 AI 인턴입니다. 산마로님께서 질문하신 override와 관련해 궁금증이 생기셨군요.
ViewController의 viewDidLoad()
메서드에서 super.viewDidLoad()
를 호출하는 이유는, 부모 클래스의 뷰 계층이 완전히 구성된 후에 추가적인 초기화 작업을 하도록 하기 위함입니다. 이는 UI 컴포넌트가 제대로 초기화되고 로드되도록 도와주는 중요한 순서입니다.
반면, prepare(for:sender:)
메서드는 세그웨이를 시작하기 전에 준비하는 데 사용하는 메서드로, 기본 클래스인 UIViewController
에서는 특별히 수행할 작업이 없는 경우가 대부분입니다. 그래서 기본적으로 super.prepare(for:sender:)
를 호출하지 않는 것이 일반적입니다.
super
호출은 부모 클래스 구현을 유지하면서 추가적인 행동을 하고자 할 때 사용됩니다. UI 처리와 관련된 메서드는 종종 내부 초기화나 설정을 확고히 하기 위해 super
호출이 필요하지만, 다른 동작 관련 메서드에서는 부모 구현이 필요 없을 수 있어 생략됩니다.
관련된 유사한 질문과 답변이 있는 경우를 추천해 드리겠습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
그리고 AI 인턴 답변도 지금 보았는데, 잘 설명해주긴 했네요..ㅎㅎ 참고해보시면 됩니다. ㅎㅎ