UIKit과 iOS에서 제일 기본적인
View에 대해 정리한 포스팅
우선 UIKit에서 UI의 구조는 아래와 같습니다.


그럼 제일 크게 보이는 부분이
1. UIWindowScene
2. UIWindowView
3. UIView
인데 이 부분을 정리할 예정입니다.
일단 UIWindowScene에 대해 알기 전에 Scenes에 대해 알아야합니다.

앱 UI의 여러 인스턴스를 동시에 관리하고, 리소스를 적절한 UI 인스턴스로 전달합니다.
Scene에는 UI의 한 인스턴스를 표시하기 위한 창과 뷰 컨트롤러가 포함됩니다.Scene은 서로 동시에 실행되어 동일한 메모리와 앱 프로세스 공간을 공유합니다.UIWindowScene UIWindowSceneDelegate
앱의 사용자 인터페이스의 한 인스턴스를 나타내는 객체
@MainActor
class UIScene : UIResponder
init(
session: UISceneSession,
connectionOptions: UIScene.ConnectionOptions
)
우리가 스토리 보드를 통해 편집하는 대부분의 ViewController들은 각자 하나씩의 화면을 담당하고 있다.
화면의 콘텐츠를 표현하고 View를 관리한다. 이를 Scene이라고 하는데, 보통 하나의 Scene을 표현하는데에는 하나의 ViewController가 사용된다.
만약 두개의 Scene으로 이루어 졌다면, 두개의 ViewController가 필요한 것이다.
UIScene은 UIResponder의 subclass이며, 사용자의 interaction을 처리하는 역할을 한다.
모든 scene은 연관된 delegate 객체를 가지고 있으며, UISceneDelegate 프로토콜을 사용한다. 또한 observer를 등록해서 notification을 보낼 수도 있다. 사용자의 어떤 이벤트던지 간에, delegate 객체 혹은 observer를 이용할 수 있다.

옵셔널 이유 → Scene이 session으로부터 connect/disconnct 될 수 있기 때문
// 현재 세션과 관련된 Scene
var scene: UIScene? { get }
// Scene의 내용이 맡은 역할
var role: UISceneSession.Role { get }
// Scene의 가능한 역할을 나타내는 상수
struct Role


그림과 같이 하나의 UIWindowScene에는 여러개의 Window를 가질 수 있음
// 해당 장면과 관련된 창
var windows: [UIWindow] { get }
// 장면과 연관된 중요한 창
var keyWindow: UIWindow? { get }
// 장면의 내용을 표시하는 화면
var screen: UIScreen { get }
실제로 UIWindowScene은 windows: [UIWindow] 배열을 가지고 있다.
scene의 상태가 변화되면, scene 객체는 이의 delegate의 매소드를 호출하는데, 이때 사용되는 delegate가 UIWindowSceneDelegate이다.

우리가 프로젝트를 생성한 후, SceneDelegate 코드를 보면 UIWindowSceneDelegate Protocol을 채택한 것을 볼 수 있다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate

앱의 사용자 인터페이스의 배경이자 뷰에 이벤트를 전달하는 객체입니다.
으로 아래와 같이 확인할 수 있습니다.

윈도우는 디바이스의 스크린을 빈틈없이 채우기 위한 객체
항상 유저 인터페이스 표현 계층의 최상위에 위치
View의 일종이지만, 직접 콘텐츠를 가지고 있지는 않음!
콘텐츠를 가진 View를 내부에 배치하여 화면에 출력하는 역할!
➡️ Window 내부에 배치된 View 콘텐츠만 변경될 뿐,
윈도우 객체 자체는 전환되지 않음
모든 애플리케이션은 최소한 하나 이상의 Window를 가지고 있음
앱을 종료하는 경우에만 사라지게 됨!
대부분의 모바일 디바이스의 디스플레이는 하나뿐임 ➡️ 그래서 윈도우는 하나라고 생각할 수 있음
그러나 만약 외부 디스플레이가 연결되는 경우에 하나의 애플리케이션이지만 두번째 디스플레이에 콘텐츠를 표현하기 위해 새로운 Window 객체를 생성! ➡️ 아이패드를 사용하는 경우도 마찬가지
공식문서 내용
- 앱의 콘텐츠를 표시하는 주 창을 제공합니다.
- 추가 콘텐츠를 표시하려면 필요에 따라 추가 창을 만듭니다.
대부분의 앱은 하나의 창만 필요로 하며, 이는 기기의 메인 화면에 앱의 콘텐츠를 표시합니다. 기기의 메인 화면에 추가 창을 만들 수 있지만, 추가 창은 일반적으로 연결된 디스플레이에 콘텐츠 표시에서 설명한 대로 외부 화면에 콘텐츠를 표시하는 데 사용 됩니다 .

사용자의 입력에 반응하는 객체필요한 콘텐츠를 채워 넣어 스크린에 나타내는 역할하나 이상의 View 들이 콘텐츠를 표현하면, 윈도우는 이를 모아 디바이스의 스크린에 출력
이때 View들이 서로 영역이 겹치지 않는 퍼즐 형태로 구성이 될 수도 있고
겹쳐지는 경우 중첩된 형태로 표현 되기도 함

1. Window가 최상위에 존재
2. TabBar View가 존재
3. Navigation View가 존재
4. Custom View가 존재
Window에 각 2,3,4번의 View들이 모아져 디바이스의 스크린에 출력되는 형식이다.

쉽게 말해, UIWindow는 액자이고, UIView는 끼워넣는 그림/사진이다.
Scenes | Apple Developer Documentation
[iOS] UIWindowScene / UIWindow / UIView
[iOS] 뷰의 계층 구조