

UIView이다.UIView 의 자식이다.🍎 Apple UIKit 공식 설명
"A view represents a rectangular area on the screen and is responsible for drawing and handling events in that area.”
→ 뷰는 ‘사각형 영역’이며, 화면에 그림을 그리거나 이벤트를 처리한다.
ViewController 가 수행한다.TableView 를 띄우면 TableView는 View, 이를 관리하는 것이 ViewController 이다.🍎 Apple 공식 설명
"UIViewController is a base class for view controllers, which manage a set of views and coordinate the flow of information between your app’s data model and your views.”
→ ViewController는 View를 관리하고, 모델과 View 사이의 데이터 흐름까지 조율하는 역할을 수행한다.
| 역할 | 설명 |
|---|---|
| 뷰 관리 | 화면에 올라가는 View들을 만들고 관리 (addSubview 등) |
| 데이터와 뷰 연결 (MVC의 C 역할) | Model(데이터) → View로 전달해서 화면에 보여주고, View에서 발생한 액션 → Model로 전달 |
| 화면 전환 관리 | present, dismiss, navigation push/pop 등을 담당 |
| 메모리 관리 | 메모리 부족할 때 뷰 내리고 다시 불러오는 작업 (didReceiveMemoryWarning) |
| 사용자 인터랙션 처리 | 버튼 클릭, 스와이프 같은 이벤트 처리 |
→ iOS에서 화면(View)이 어떻게 만들어지고 사라지는지 순서대로 정리한다.
| 메서드 | 언제 호출되는가? | 용도 |
|---|---|---|
init() | 뷰컨이 만들어질 때 (코드로 생성하면 여기부터 시작) | 변수 초기화 |
loadView() | 시스템이 View 만들 때 | 직접 커스텀 View 만들고 싶을 때 override |
⭐viewDidLoad() | View가 메모리에 올라왔을 때 (딱 한 번) | UI 초기 설정, 데이터 바인딩 |
⭐viewWillAppear() | 화면에 보이기 직전 | 화면에 맞게 데이터 새로고침 |
⭐viewDidAppear() | 화면 완전히 보일 때 | 애니메이션 시작, API 호출 등 |
viewWillDisappear() | 다른 화면으로 넘어가기 직전 | 저장해야 할 거 처리 |
viewDidDisappear() | 화면에서 완전히 사라졌을 때 | 타이머 멈추기, 리소스 정리 |
⭐deinit() | 메모리에서 완전 해제될 때 | 메모리 정리, 관찰자 해제 |
viewDidLoad() 는 딱 1번만 호출된다. (초기 세팅용)viewWillAppear() , viewDidAppear() 는 화면이 그려질 때 마다 호출된다.deinit() 를 잡지 않으면 메모리 누수(retain cycle)이 생겨 앱이 죽을 수 있다.import UIKit
class MyViewController: UIViewController {
// 뷰컨 생성될 때 (코드로 만들면 여기부터 시작)
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
print("👉 init() 호출")
}
// 스토리보드용 필수
required init?(coder: NSCoder) {
super.init(coder: coder)
print("👉 init(coder:) 호출")
}
// 커스텀 View 제작 시
override func loadView() {
super.loadView()
print("👉 loadView() 호출")
}
// 뷰가 메모리에 올라오면 딱 한 번 호출
override func viewDidLoad() {
super.viewDidLoad()
print("👉 viewDidLoad() 호출")
view.backgroundColor = .white
}
// 화면 뜨기 직전에 매번 호출
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("👉 viewWillAppear() 호출")
}
// 화면 완전히 뜨면 호출
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("👉 viewDidAppear() 호출")
}
// 화면 사라지기 직전
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("👉 viewWillDisappear() 호출")
}
// 화면 완전히 사라진 후
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("👉 viewDidDisappear() 호출")
}
// 메모리 해제 직전 (deinit)
deinit {
print("👉 deinit() 호출 - 메모리에서 사라짐")
}
}
→ 2-2-1.에서 작성한 예시 코드를 실행했을 때 아래와 같이 콘솔에 출력된다.
👉 init() 호출
👉 loadView() 호출
👉 viewDidLoad() 호출
👉 viewWillAppear() 호출
👉 viewDidAppear() 호출
(화면 전환해서 사라지면 아래가 호출)
👉 viewWillDisappear() 호출
👉 viewDidDisappear() 호출
👉 deinit() 호출 - 메모리에서 사라짐
| 역할 | View (UIView) | ViewController (UIViewController) |
|---|---|---|
| 정의 | 화면에 보이는 요소 | UI 관리하는 관리자 |
| 하는 일 | 그림 그리고 터치 받음 | 화면 전환, 데이터 전달, 생명주기 관리 |
| 공식 문서에서 정의하는 것 | "그리기와 이벤트 처리" | "View 관리하고 데이터 모델 연결" |
viewDidLoad() → 화면에 그려질 때 최초 1회만 호출viewWillAppear() , viewDidAppear() → 화면이 그려질 때 마다 호출viewWillDisappear() , viewDidDisappear() → 화면에서 사라질 때 마다 호출deinit() → 메모리에서 완전히 해제될 때 호출