iOS UIKit으로 프로젝트를 진행하다보면 ViewController의 여러 생명주기를 접하게 되는데, 이 생명주기에 대해 제대로 알지 못하고 그냥 되는대로 사용하고 있는 것 같아서 이번 시간에는 ViewController의 생명주기(Life Cycle, 라이프 사이클)에 대해 공부한 내용을 정리해보겠습니다.
개요
일반적으로 우리가 사용하는 모바일 앱들은 하나 이상의 화면으로 이루어져 있습니다.
즉, 하나의 앱은 최소 하나 이상의 ViewController
(이하 '뷰 컨트롤러')를 갖고 있다는 것인데요.
이 뷰 컨트롤러는 각각의 뷰 컨트롤러마다 생명주기를 갖고 있습니다.
생명주기는 각각의 뷰 컨트롤러가 화면에 나타나거나 사라질 때, 즉 화면이 전환될 때 호출되는 함수들을 의미합니다.
ViewController의 생명주기
뷰 컨트롤러의 주 생명주기는 아래와 같습니다.
이제부터 이 생명주기의 메서드들에 대해 하나하나 살펴보겠습니다.
loadView
loadView
는 view(이하 '뷰')를 메모리에 올리는 과정으로, 뷰를 바꿀 수 있는 시점입니다.
뷰 컨트롤러가 메모리에 올라온 후 인스턴스 메서드인 loadView
를 호출함으로써 화면을 메모리에 올리게 됩니다.
각 뷰 컨트롤러는 기본적으로 default view를 갖고 있는데, 뷰 컨트롤러의 뷰를 직접 코드로 작성한 custom view로 바꾸기 위해 loadView
메서드를 재정의할 수 있습니다.
이 때, 유의해야할 점이 몇 가지 있습니다.
- 뷰 컨트롤러와 연결된 스토리보드가 있다면 해당 스토리보드에서 뷰를 로드해야합니다.
➡️ 스토리보드를 통해 뷰를 생성하거나 초기화하는 경우는loadView
메서드를 재정의해서는 안된다는 의미입니다.
➡️ 뷰 컨트롤러와 연결된 스토리보드가 있는 상태에서loadView
메서드를 재정의할 경우 스토리보드가 무시되어 화면에 아무것도 나오지 않게 되기 때문입니다. loadView
메서드를 재정의할 때는super
를 사용하지 않는다.
➡️loadView
메서드를 재정의할 경우, 메서드 내부에서super.loadView
를 하지 않습니다.
➡️ 정확하게loadView
메서드의 내부 동작을 알 수는 없지만,loadView
메서드를 재정의할 경우 어차피super.loadView
의 기본 동작이 무시되기 때문으로 보입니다.
viewDidLoad
viewDidLoad
는 뷰가 생성되었을 때, 즉 뷰가 메모리에 완전히 올라온 후 한 번만 호출됩니다.
단, 뷰가 메모리에서 해제된 후에 다시 메모리에 올라온다면 그 때는 다시 호출될 수 있습니다.
주로, 뷰의 추가 초기화를 진행하기 위해 재정의하여 사용합니다.
뷰가 메모리에 올라올 때 딱 한번만 실행되므로, 처음 한번만 실행하면 되는 코드를 작성합니다.
일반적으로는 뷰 객체의 추가 초기화 내용을 담은 함수를 별도로 작성한 후, viewDidLoad
에서 해당 메서드를 호출하는 방식으로 많이 사용합니다.
viewWillAppear
viewWillAppear
는 뷰가 실제 화면에 나타나기 직전에 호출됩니다.
viewDidLoad
가 메모리에 올라온 후 한 번만 호출되는 것과는 다르게, 메모리와 상관없이 다른 뷰 컨트롤러를 보다가 다시 돌아오는 등 뷰가 화면에 나타날 때마다 호출됩니다.
주로 뷰를 띄울 때마다 특정 처리가 필요하거나 다른 뷰에서 처리한 작업 결과로 뷰를 업데이트 해야하는 경우, 즉 화면 갱신이 필요한 경우에 사용합니다.
예를 들면, 카카오톡의 특정 채팅방에서 채팅을 한 후 채팅방 목록으로 나왔을 때 마지막으로 채팅한 내용을 채팅방 목록에 보여주거나, 기차 좌석 예약 앱에서 좌석을 예약한 후에 좌석 정보를 업데이트해서 화면에 보여줄 때 등이 있습니다.
viewDidAppear
viewDidAppear
는 뷰가 실제 화면에 나타난 직후에 호출됩니다.
뷰의 애니메이션을 시작하거나, 타이머를 시작하는 등 화면이 나타난 후에 필요한 작업을 처리할 때 사용합니다.
viewWillDisappear
viewWillDisappear
는 뷰가 화면에서 사라지기 직전에 호출됩니다.
뷰의 애니메이션을 멈추거나, 타이머를 멈추는 등 화면이 사라지기 직전에 마쳐야할 작업들을 처리할 때 사용합니다.
viewDidDisappear
viewDidDisappear
는 뷰가 화면에서 사라진 직후 호출됩니다.
이 때, 뷰는 화면에서 사라진 것일 뿐, 메모리에서 해제된 것을 의미하지는 않습니다.
ViewController의 생명주기라는 개념이 왜 필요할까?
지금까지 뷰 컨트롤러의 생명주기에 대해 알아봤는데, 그렇다면 이러한 생명주기라는 개념은 왜 필요한 것일까요?
그 답은 이미 위에서 각 생명주기를 설명하면서 대략적으로 나왔는데요.
iOS 앱의 경우 화면 전환시에 운영체제에 의해 내부적으로 특정 함수가 호출되는데, 이를 이용하여 화면에 보여지는 정보를 최신화하는 등, 화면 전환의 특정 시점에서 특별한 작업을 해야할 경우 유용하게 사용할 수 있습니다.
마무리
이번 시간에는 ViewController의 생명주기에 대해 살펴보았는데요.
사실 뷰 컨트롤러의 생명주기는 위에서 설명한 6 종류 외에도 뷰의 Drawing Cycle과 연관된 메서드 등 다양한 메서드들이 존재합니다.
해당 메서드들은 후에 뷰의 Drawing Cycle에 대해 알아보면서 같이 알아보는 것으로 하겠습니다.
다음 시간에는 iOS 앱의 생명주기에 대해 알아보겠습니다.
후기
그 동안 프로젝트를 하면서 정말 막무가내로 생명주기를 사용했던 것 같은데, 그래도 몇몇 부분을 제외하면 얼추 용도에 맞게 사용한 것 같아서 다행이라는 생각이 듭니다.
뷰 컨트롤러에 이어 다음 시간에는 iOS 앱의 생명주기에 대해 알아볼 텐데, 앱 생명주기까지 공부하고 나면 지금처럼 왜 필요한지 모르고 AppDelegate 같은 것을 쓰는 일은 없을 것 같아서 벌써 기대가 되네요.
'Swift > UIKit' 카테고리의 다른 글
[UIKit] UIBarAppearance - iOS 시스템 바의 기본 모양 커스터마이징하기 (0) | 2024.02.04 |
---|---|
[UIKit] UISlider / 미디어 플레이어의 재생바는 어떻게 구현할 수 있을까? 2️⃣ (0) | 2024.01.07 |
[UIKit] UIProgressView / 미디어 플레이어의 재생바는 어떻게 구현할 수 있을까? 1️⃣ (1) | 2023.12.24 |
[UIKit] iOS 15 이후의 UIButton 구성 방법 (0) | 2023.06.18 |
[UIKit] UIWindow 객체의 역할 (0) | 2023.05.21 |