앱 생명주기와 AppDelegate SceneDelegate에 이어서 뷰 계층구조를 공부하고자 한다
window, scene, view 용어가 익숙하지만 스스로 설명하기 어렵다는 점을 인지하면서
공부의 필요성을 느꼈다 ㅠㅠ
용어 개념을 먼저 보고 계층구조도 자연스럽게 익혀보자,, 총총
용어정리
각 용어의 개념은 다음과 같다
view
iOS에서 UI를 구성하는 기본 단위는 view 이고, view들은 계층적으로 구성될 수 있다
view는 콘텐츠를 담아 스크린에 표시하고 사용자의 입력에 반응하는 객체이다
view는 UIView 클래스를 상속한 클래스로 구현된다
window
window는 스크린을 채우기 위한 객체로 항상 유저 인터페이스 표현 계층의 최상위에 위치한다
view의 일종이지만 직접 컨텐츠를 가지고 있지 않고 대신 콘텐츠를 지닌 view를 내부에 배치해 화면에 출력한다
모든 어플리케이션은 최소한 하나 이상의 window를 가지고 있고, 앱을 종료하는 경우에만 사라진다.
iOS 13 이전에는 하나의 앱에 하나의 window!
그 이후부터는 멀티 태스킹이나 외부 기기 연결과 같은 기능을 위해 다중 window도 지원!
scene
Scene은 앱 UI의 한 인스턴스를 나타내는 객체이다
하나의 앱이 여러 개의 UI 인스턴스를 동시에 실행할 수 있게 해주는 개념으로 iOS 13 이후 등장했다
View 계층구조
이제 계층구조에서 하단부터 살펴보면 다음과 같다
UIView
콘텐츠를 담은 view를 스크린 상에 표시하고, 사용자의 입력에 반응한다
UIWindow
콘텐츠를 가진 뷰를 내부에 배치하여 화면에 출력하는 역할을 수행한다
UIViewController
window와 view는 ViewController를 통해 연결 될 수 있다
ViewController는 view의 계층을 관리하여 window에 전달한다
또한, touch event를 window로부터 전달받아 처리하는 역할을 수행한다
window가 view를 직접 참조 X
window와 view 사이에서 중간다리 역할인 셈이다
UIWindowScene
UIScene의 서브클래스로 하나 이상의 window를 관리한다
UIWindowScene => windows: [UIWindow]
UIScene (최상위)
화면의 컨텐츠를 표현하고 view를 관리한다
대부분의 ViewController들은 각자 하나씩의 화면을 담당하고, 화면의 컨텐츠를 표현하고 view를 관리하며 이를 scene이라고 한다
보통 하나의 scene을 표현할 때 하나의 viewController이 사용된다
UIScene은 UIResponder의 서브 클래스며 사용자의 이벤트를 처리한다
모든 scene은 연관된 delegate 객체를 가지고 있고, UISceneDelegate 프로토콜을 사용한다
obeserver를 등록해 noti를 보낼 수도 있다
그림으로 표현하면 다음과 같다
그리고 이 그림 전체가 하나의 scene이다!

요약
UIScence
↓
UIWindowScene (해당 Scene의 window 관리)
↓
UIWindow (view 계층 구조의 컨테이너)
↓
UIViewController (view 로직 관리)
↓
UIView (실제 UI 컴포넌트)
+
어떤 view가 view를 포함하고 있다면, 이는 SuperView(슈퍼 뷰)가 되는 것이고,
SuperView에 포함된 View는 SubView(서브 뷰)가 된다.
최근 면접 때 View의 구조를 설명해라고 했는데, SwiftUI 만 하다보니 stack처럼 쌓이는 것,, Superview 정도만 말했었다
그런데 알고 보니 정말 많았네,, 화이팅..!
Reference
1. https://velog.io/@ellyheetov/iOS-뷰의-계층-구조
2. https://superohinsung.tistory.com/143