본문 바로가기
공부/[iOS&Swift]

[iOS] Scene, Window, View에 대한 아주 기초적인 정리

by 인생은아름다워 2022. 2. 15.

iOS를 공부하다 보면 제목과 같이 Scene, Window, View라는 말을 정말 많이 보게 되고, Xcode에서 개발을 할 경우에 UIViewControllerScene이라느니, View라는 것 등등의 표현들을 아주 많이 볼 수 있다.

 

그런데 각각의 용어에 대해서 정확하게 개념정리가 되어있지 않아서 딱 Scene 하면 뭘 의미하는지를 잘 모르겠다는 생각이 들어서 정확하게 개념을 정리해보려 한다.

 

특히, 생명주기를 공부하다보면 iOS13 이상의 버전부터는 Scene delegate가 App delegate를 대신하여 ~~를 한다. 뭐 이런 표현도 등장하는데, 나 같은 경우는 UIViewControllerScene의 `Scene` 때문에 매우 혼동을 했었기에 정리해보았다.


✏️ iOS의 UI structure

iOS의 UI 구조를 보면 위 사진과 같다.

여기서 UIScreen, UIWindowScene, UIWindow, UIView에 대한 정의를 알고, Xcode상에서 어떤 식으로 쓰이고 있는지? 정도를 알면 뭔가 받아들이기 쉬울 것 같다.

UIScreen : hardware - based display라는걸 보니, 그냥 내가 가진 iPhone, iPad 등의 화면 그 자체를 지칭하는 클래스인 듯하다. 그러니까, 이 물리적인 스크린 위에 UIWindowScene을 여러 개 배치시킬 수 있고, 그 위에 UIWindow, UIView 순으로 계층을 가지고 있다.

UIWindowScene : 하나 또는 그 이상의 windows를 매니징 하는scene

여기서 처음 scene이라는 말이 등장한다. 실제 공식문서의 설명을 읽어보면 UIWindowScene은 scene에서 표시하는 하나 또는 그 이상의 window를 포함하여 App UI의 하나의 인스턴스를 관리한다고 한다.

뭔가 느낌이 오기 시작한다. 결론은 이게 Scene인 것이다. Scene은 여러 Window를 포함할 수 있는 하나의 인스턴스인데 이 Scene을 관리하는 객체가 바로 UIWindowScene이다!라고 이해하면 될 것 같다.

또한 scene의 state 변화가 생길 경우 UIWindowSceneDelegate 프로토콜을 채택하는 delegate에게 state변화를 알린다고 하는데, 실제로 우리 Xcode상의 SceneDelegate.swift파일을 보면 이 프로토콜을 채택했음을 알 수 있다.

UiWindow : 앱 UI의 배경이며, 이벤트들을 뷰로 보내주는 객체이다! 중요한 말은 UI의 배경! 사실 내가 궁금해했던 Scene, Window, View의 차이는 이 정도면 정리가 되는 것 같다.


다시 위의 UI structure 그림을 보면, 결국 Hardware - based 인 Screen이 존재하고, 그 위에 UIWindowScene이 존재한다.

 

나중에 살펴볼 생명주기 관련 공부에서 App / Scene 이러한 표현이 쓰일 텐데 그 Scene의 객체가 바로 이 UIWindowScene이다! 그리고 이 Scene은 여러 인스턴스가 존재할 수 있으며, iOS는 하나의 앱에 대해 여러 개의 화면을 가져서 동시에 띄울 수 있는 Multiple scenes기능을 구현하는 것 같다.(@iOS13~)

 

그리고 그 Scene안에는 보이지 않는 ‘틀’인 Window가 존재하며 이 Window가 필요에 따라서 View 들을 가지는 것이다. (View에 대한 내용은 아래 문서를 참조하면 좋을 것 같다.)

 

이 내용들을 실제 애플리케이션의 화면에서 어떻게 나타나는지 살펴보면 아래 그림과 같다.

그림을 보면 선택된 부분(오른쪽에서 파랗게 선택된 부분)이 UIWindow이다. UIWindowScene은 그 위의 검은색으로만 표현되어있는 부분(UIWindowScene - (Foreground Active)라고 쓰여있는 탭)이다.

🍎 결과

직접 구현해본 화면을 통해 UI structure를 살펴보니 어느 정도 이해가 되는 것 같다. 이제 생명주기를 공부해볼 수 있겠다!

🍎 참고 자료

UIScreen

UIWindowScene

UIWindow

UIView

댓글