1. UIKit 란?
UIKit은 2008년 아이폰의 탄생과 함께 등장한 IOS 애플리케이션 개발의 가장 기본이 되는 UI 프레임워크다.
오늘날 IOS 앱의 실행 구조와 생명주기는 대부분 UIKit을 기준으로 설계되어 있다.
방식 (How) : 명령형 (Imperative)
UIKit은 명령어 방식을 따른다.
개발자가 화면에 무엇을, 언제, 어떻게 보여줄지를 순서대로 직접 지시해야 한다.
이는 요리사에게 "냉장고에서 달걀을 꺼내고, 팬을 달군 뒤 기름을 두르고, 달걀을 깨서 익혀라."라고 말하는 것과 같다.
따라서 각 단계가 명확하고 통제 가능하지만, 모든 과정을 직접 관리해야 한다.
특징
- UI 요소의 생성, 수정, 삭제를 개발자가 직접 제어
- 화면 구조와 이벤트 흐름이 명확함
- 복잡한 화면일수록 코드 양이 빠르게 증가됨
- 유지보수 난이도가 점점 높아질 수 있다.
2. SwiftUI 란?
SwiftUI는 2019년 Apple이 발표한 차세대 UI 프레임워크다.
UIKit의 복잡성을 줄이고 더 직관적인 UI 개발을 목표로 설계되었다.
방식 (What) : 선언형(Declarative)
SwiftUI는 선언형 방식을 따른다.
개발자는 화면을 "어떻게" 그릴지 설명하지 않고, "무엇을" 보여주고 싶은지만 선언한다.
이는 요리사가 "나는 반숙 달걀 프라이가 먹고 싶어"라고 말하는 것과 같다.
그러면 불 조절, 조리 순서, 시간 계산을 스스로 처리한다.
특징
- 코드가 간결하고 읽기 쉬움
- 상태(State) 변화에 따라 UI가 자동으로 갱신됨
- 개발 속도가 빠르고 반복 작업이 줄어듦
3. UIKit, SwiftUI 차이점
| 구분 | UIKit (명령형) | SwiftUI (선언형) |
| 등장 시기 | 2008년 (아이폰 초기) | 2019년 (최근) |
| 핵심 | 어떻게(How) 화면을 만들지 지시 | 무엇(What)을 보여줄지 선언 |
| 코드 스타일 | 단계별 명령, 이벤트 중심적 | 데이터 상태 중심, 자동 업데이트 |
| 장점 | 세밀한 제어 가능 | 코드 간결함, 빠른 개발 속도 |
| 단점 | 코드가 길어지고 복잡함 | 오래된 IOS 버전 지원이 어려움 |
4. UIApplication & App Delegate: 앱의 중앙 통제실
IOS 앱은 사용자가 아이콘을 눌렀다고 해서 곧바로 화면 코드부터 실행되지 않는다.
그보다 먼저 운영체제(IOS)가 앱 전체를 대표하는 객체를 하나 생성한다.
그 객체가 바로 UIApplication이다.
UIAPPlication 은 앱 전체 상태를 관리한다.
- 앱이 실행 중인지 확인
- 백그라운드에 있는지 확인
- 시스템 이벤트가 도착했는지 확인
개발자는 보통 UIApplication을 직접 생성하지 않고 IOS가 앱을 실행하는 순간 자동으로 만들어주며 앱이 살아 있는 동안 항상 하나만 존재한다.
App Delegate 란?
UIApplication 이 보내주는 중요한 생명주기 이벤트를 받아 처리하는 관리자다.
생명주기 이벤트라는 말은 앱이 실행되고, 상태가 바뀌고, 종료되기까지의 흐름 속에서 IOS가 특정 시점마다 호출해 주는 공식적인 알림 지점을 의미한다.
> "앱이 지금 어떤 상태로 들어가거나 나가고 있다"는 걸 IOS가 개발자에게 알려주는 신호들
AppDelegate는 다음과 같은 질문에 답하는 역할을 한다.
- 앱이 처음 실행되었는가?
- 앱이 종료되려는가?
- 시스템 자원이 부족한가?
- 앱 전역 설정을 언제 초기화할 것인가?
앱 실행 시 일어나는 일 [ 핵심 함수: application(_:didFinishLaunchingWithOptions:) ]
사용자가 앱 아이콘을 눌렀을 때 내부적으로는 다음 순서가 진행된다.
[앱 실행 요청]
↓
[UIApplication 생성]
↓
[AppDelegate 생성]
↓
[application(_:didFinishLaunchingWithOptions:)] <- 핵심함수
이 메서드는 앱이 "준비 다 됐어"라고 말하는 것과 같다.
이 시점에서 주로 수행하는 작업은 다음과 같다.
- 앱 전역 설정 초기화
- 라이브러리 로딩
- 기본 환경 구성
앱의 기본 뼈대를 세우는 단계이다.
5. UIScene & Scene Delegate: 독립된 작업 공간의 격리
앞에서 살펴본 "UIApplication"과 "AppDelegate"는 앱 전체를 하나의 단위로 관리한다.
하지만 IOS가 발전하면서 "앱 하나 = 화면 하나"라는 전제는 더 이상 맞지 않게 되었다.
아이패드의 멀티태스킹, 다중 창(Window) 환경이 등장하면서
하나의 앱 안에 여러 개의 화면 인스턴스가 동시에 존재할 수 있게 되었다.
이 문제를 해결하기 위해 도입된 개념이 바로 UIScene이다.
UIScene 란?
앱 안에서 실행되는 "화면 단위 실행 환경"이다.
같은 앱이라도
- 한 화면은 포그라운드에 있고
- 다른 화면은 백그라운드에 있을 수 있으며
- 각각 독립적인 생명주기를 가진다
Scene은 앱의 부분 인스턴스라고 이해하면 된다.
AppDelegate와 SceneDelegate의 역할 차이
- AppDelegate는 “앱이 살아 있는가?”
- SceneDelegate는 “이 화면이 보이고 있는가?”
로 나눌 수 있다.
Scene 그림
하나의 App (Process)
|
+-- Scene A (메인 화면)
|
+-- Scene B (멀티태스킹 화면)
각 Scene은 서로 영향을 최소화하도록 설계되어 있다.
SceneDelegate가 관리하는 주요 상태
SceneDelegate는 다음과 같은 화면 단위 생명주기를 관리한다.
| sceneDidBecomeActive | 화면이 사용자에게 보이고 있음 |
| sceneWillResignActive | 화면이 가려지기 직전 |
| sceneDidEnterBackground | 화면이 완전히 숨겨짐 |
| sceneWillEnterForeground | 다시 나타나기 직전 |
이 상태 전환은
사용자 행동이나 시스템 이벤트에 따라 자동으로 발생한다.
Scene은 단순히 화면이 아니라
작업 중이던 상태를 포함한 하나의 공간이다.
예를 들어:
- Scene A에서는 로그인 상태
- Scene B에서는 공지사항 탐색
이 두 상태는 서로 섞이지 않고 유지되어야 한다.
이 구조를 통해 iOS는 멀티태스킹 중에도 사용자 경험을 유지한다.
6. Environment & System Changes : 시스템 환경 변화 대응
지금까지 살펴본 구조는 모두 앱 내부에서 일어나는 일에 대한 이야기였다.
Environment란?
Environment는 앱을 둘러싼 시스템 상태와 외부 조건의 집합이다.
이 환경은 개발자가 제어하는 것이 아니라 운영체제가 결정하고 앱에 통보한다.
- 다크 모드 / 라이트 모드 변경
- 글자 크기 및 접근성 설정 변경
- 화면 회전
- 화면 녹화 시작 / 종료
- 외부 디스플레이(AirPlay, HDMI) 연결
이처럼 앱 외부 환경이 변하는 순간 그 사실을 앱에게 알려준다.
IOS는 이 수많은 환경 정보를 'Trait Collection'이라는 하나의 묶음으로 관리한다.
> 현재 환경 상태 보고서 같은 역할을 한다.
환경이 바뀔 때마다 이 'Trait Collection' 이 갱신되고 앱은 그 변화를 감지하게 된다.
