iOS 개발을 시작하면서 가장 처음 마주하게 되는 개념 중 하나가 바로 ViewController이다. 화면 하나를 담당하며, 그 안에서 사용자와의 상호작용을 처리하는 중심 역할을 한다.
이번 글에서는 ViewController가 어떤 역할을 하는지, 그리고 iOS에서 어떤 순서로 생명주기 메서드들이 호출되는지 정리해보려고 한다. 직접 실습하며 알게 된 내용을 바탕으로, 처음 접하는 분들도 이해하기 쉽게 풀어보았다.
ViewController란?
- 앱 내 하나의 화면을 담당하는 컨트롤러
- 화면에 보이는 모든 뷰(UIView, UIButton, UILabel 등)를 관리
- 사용자의 액션에 따라 데이터를 변경하거나 다른 화면으로 전환
- UIKit의 기본 구성 요소
Apple 공식 문서에서는 UIViewController를 다음과 같이 정의하고 있다:
"A view controller manages a hierarchy of views and facilitates the interaction between those views and your app’s data."
— Apple Developer Documentation
즉, ViewController는 UI와 데이터 사이의 다리 역할을 하며, 앱의 중요한 구조 단위이다.
ViewController의 생명주기(Lifecycle)
ViewController는 화면이 등장하고 사라지는 과정에서 특정 시점마다 시스템이 호출해주는 메서드들이 존재한다.
UIViewController - Apple 공식 문서
언제 어떤 메서드를 써야 할까?
viewDidLoad()
- 호출 시점: 뷰가 메모리에 처음 로드되었을 때, 딱 한 번 호출됨
- 사용 목적: UI 초기화, 데이터 초기 세팅, 네트워크 요청 시작 등
- 공식 문서: viewDidLoad – Apple Docs
override func viewDidLoad() {
super.viewDidLoad()
// UI 초기 세팅
view.backgroundColor = .white
// 네트워크 호출
fetchUserProfile()
// 테이블 뷰 설정
tableView.delegate = self
tableView.dataSource = self
}
앱이 실행되면 가장 먼저 호출되므로 기본 설정은 여기서 처리하는 것이 좋다.
viewWillAppear(_:)
- 호출 시점: 뷰가 화면에 표시되기 직전마다 호출됨
- 사용 목적: 최신 데이터 반영, 화면 상태 갱신
- 공식 문서: viewWillAppear – Apple Docs
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// 뷰가 다시 보여질 때마다 데이터를 리로드
tableView.reloadData()
// 상태 바 숨기기
navigationController?.setNavigationBarHidden(true, animated: true)
}
viewDidAppear(_:)
- 호출 시점: 뷰가 화면에 완전히 표시된 후 호출됨
- 사용 목적: 애니메이션 시작, 트래킹 코드 실행, 사용자 상호작용 가능 상태 진입
- 공식 문서: viewDidAppear – Apple Docs
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 페이드 인 애니메이션 시작
UIView.animate(withDuration: 0.3) {
self.bannerView.alpha = 1.0
}
// Google Analytics 트래킹
Analytics.logEvent("main_screen_viewed", parameters: nil)
}
화면 전환 애니메이션이 끝난 후의 동작이 필요할 때 유용하다.
viewWillDisappear(_:)
- 호출 시점: 뷰가 사라지기 직전 호출됨
- 사용 목적: 상태 저장, 타이머 중지, 리소스 해제 등
- 공식 문서: viewWillDisappear – Apple Docs
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// 사용자가 입력 중이던 내용을 임시 저장
saveDraft()
// 타이머 멈추기
countdownTimer.invalidate()
}
화면 이동 전에 처리해야 할 저장, 종료 작업은 이 타이밍에!
viewDidDisappear(_:)
- 호출 시점: 뷰가 완전히 화면에서 사라진 후 호출됨
- 사용 목적: 리소스 해제, 화면 종료 처리
- 공식 문서: viewDidDisappear – Apple Docs
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// 오디오 재생 종료
audioPlayer?.stop()
// 관찰자 제거
NotificationCenter.default.removeObserver(self)
}
뷰가 사라진 후 메모리 정리나 감시 해제 등에 적절하다.
요약
메서드 이름 | 설명 | 사용 예시 |
viewDidLoad | 뷰가 메모리에 올라왔을 때 호출. 초기 설정 작업 | UI 초기 설정, API 호출 등 |
viewWillAppear | 뷰가 곧 나타나기 직전 호출 | 화면 갱신, 상태 업데이트 |
viewDidAppear | 뷰가 완전히 나타난 후 호출 | 애니메이션 시작, 이벤트 로딩 |
viewWillDisappear | 뷰가 곧 사라지기 직전 호출 | 상태 저장, 작업 중단 |
viewDidDisappear | 뷰가 완전히 사라진 후 호출 | 리소스 정리, 이벤트 종료 |
ViewController의 생명주기는 UIKit 앱에서 정말 중요한 기본 개념이다.처음에는 단순히 메서드를 외우는 식으로 접근할 수도 있지만, 실제 앱을 만들면서 언제 어떤 메서드가 호출되는지를 직접 경험해보는 게 가장 좋다.
나도 실습하면서 "아 여긴 진짜 초기에 한 번만 불리는구나", "화면에 다시 돌아올 때마다 뭔가 새로 해야겠네" 같은 인사이트를 얻을 수 있었다. 기초 개념을 단단히 하고 나면, 화면 간 전환이나 데이터 처리, 애니메이션 처리 등도 더 쉽게 다룰 수 있게 된다.
더 자세한 설명이 궁금하다면 공식 문서를 꼭 읽어보는 걸 추천한다. 생각보다 잘 정리되어 있고, 실제 앱 개발에서 많이 쓰이는 예시도 함께 볼 수 있다!
'iOS > UIKit' 카테고리의 다른 글
[ UIKit ] UITableViewCell에서 AutoLayout 충돌 이슈 해결 (0) | 2025.04.16 |
---|---|
[ UIKit ] SwiftUI만 공부하던 내가 UIKit MVVM에서 클로저를 처음 마주쳤을 때 (0) | 2025.04.09 |
[ UIKit ] Combine으로 상태를 바인딩하는 방법 (0) | 2025.04.06 |
[ UIKit ] Delegate 패턴 알아보기 (0) | 2025.04.06 |
[ UIKit ] UISlider (20) | 2024.02.03 |