Scene, Window, View의 개요
Apple 생태계에서 Scene, Window, View는 UI 계층 구조의 중요한 구성 요소이다.
개념 | 역할 | 주요 특징 |
Scene | 앱의 UI와 상태 관리 | 여러 개의 Scene을 가질 수 있으며, 멀티 윈도우 지원 |
Window | 화면에 View를 표시하는 컨테이너 | UIWindow를 통해 앱의 주요 콘텐츠를 표시 |
View | 화면에 표시되는 개별 UI 요소 | UIView를 기반으로 하며, 계층 구조를 가짐 |
Scene (UIScene)
Scene은 앱의 UI와 상태를 관리하는 단위이다. iOS 13부터 멀티 윈도우 지원이 도입되면서 Scene 개념이 추가되었다.
Scene의 주요 특징
멀티 윈도우 지원: 하나의 앱에서 여러 개의 Scene을 가질 수 있음.
상태 관리: Scene은 앱의 상태를 저장하고 복원할 수 있음.
독립적인 UI: 각 Scene은 독립적으로 동작하며, 개별적인 UI와 데이터를 가질 수 있음.
SceneDelegate의 역할
Scene을 관리하기 위해 UISceneDelegate
가 도입되었으며, 주요 역할은 다음과 같다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = ViewController()
self.window = window
window.makeKeyAndVisible()
}
}
SceneDelegate
에서 새로운 UIWindow를 생성하고, rootViewController를 설정하는 방식으로 UI를 구성한다.
Scene과 연관된 개념
Scene Session: Scene의 상태를 유지하는 객체.
Multiple Scenes: 하나의 앱에서 여러 Scene을 가질 수 있음 (예: iPad에서 두 개의 앱 인스턴스 실행 가능).
Window (UIWindow)
Window는 View를 담고 있는 최상위 컨테이너로, 화면에 표시되는 모든 UI 요소를 관리한다.
UIWindow의 주요 특징
View를 담는 컨테이너 역할: 하나 이상의 View를 포함하며, 화면에 표시됨.
Scene과 연결: iOS 13 이후, UIWindow는 UIWindowScene과 연결되어 관리됨.
Key Window: 앱에서 현재 활성화된 주(Window)를 의미하며, 사용자 입력을 받음.
UIWindow 설정 예제
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = ViewController()
window.makeKeyAndVisible()
UIWindow를 생성하고 rootViewController
를 설정한 후, makeKeyAndVisible()
을 호출하여 화면에 표시한다.
Window와 연관된 개념
Key Window: 현재 활성화된 UIWindow.
UIWIndowScene: UIWindow를 포함하는 Scene 객체.
View (UIView)
View는 화면에 표시되는 UI요소의 기본 단위이다. 모든 UI 요소(Button, Label 등)는 UIView를 상속받는다.
UIView의 주요 특징
View 계층 구조: 하나의 View는 여러 개의 하위 View를 가질 수 있음.
그리기(Rendering) 기능: 화면에 그래픽을 표시하는 역할을 담당.
사용자 입력 처리: 터치 이벤트를 감지하고 처리할 수 있음.
UIView 계층 구조 예제
let parentView = UIView()
let childView = UIView()
parentView.addSubview(childView)
addSubview(_ :)
를 통해 View를 계층적으로 배치할 수 있다.
View와 연관된 개념
UIViewController: View를 관리하는 컨트롤러.
CALayer: View의 그래픽 표현을 담당하는 Core Animation 객체.
Scene, Window, View의 관계
App
├── Scene (UIScene)
│ ├── Window (UIWindow)
│ │ ├── View (UIView)
│ │ │ ├── Subview (UILabel, UIButton, UITableView 등)

Scene이 Window를 포함하고, Window가 View를 포함하는 계층 구조를 가진다.
Scene과 Window의 관계
하나의 Scene은 하나 이상의 Window를 가질 수 있음.
여러 개의 Scene을 지원하는 경우, 각 Scene마다 별도의 Window가 생성됨.
Window와 View의 관계
Window는 하나 이상의 View를 포함하며, View는 화면에 표시되는 UI 요소를 담당함.
ViewController가 View를 관리하며, Window의
rootViewController
에 설정됨.
추가 개념
AppDelegate vs SceneDelegate
iOS 12 이하:
AppDelegate
가 UIWindow를 직접 관리.iOS 13 이상:
SceneDelegate
가 도입되어 UIWindow를 Scene에서 관리.
Mac Catalyst와 멀티 윈도우 지원
Mac Catalyst를 통해 iPad 앱을 macOS에서 실행할 경우, 여러 개의 Scene을 지원할 수 있음.
SwiftUI에서 Scene, Window, View의 변화
SwiftUI에서는
Scene
을 직접 정의할 수 있으며,WindowGroup
을 사용하여 여러 Scene을 관리할 수 있음.
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
UIKit과 달리, SwiftUI에서는 Scene과 View의 개념이 더욱 명확하게 분리됨.