[UIKit] View와 ViewController

Daehyeon Yun·2025년 3월 22일
post-thumbnail

1. View(UIView)란?

  • iOS 화면에서 눈에 보이는 모든 UI 요소는 UIView이다.
  • 버튼, 라벨, 이미지, 스크롤뷰 모든 것이 전부 UIView 의 자식이다.
  • 화면에 그리기, 터치 이벤트 받기, 애니메이션 등 모든 역할을 담당한다.

🍎 Apple UIKit 공식 설명
"A view represents a rectangular area on the screen and is responsible for drawing and handling events in that area.”
→ 뷰는 ‘사각형 영역’이며, 화면에 그림을 그리거나 이벤트를 처리한다.


2. ViewController(UIViewController)란?

  • UIViewController는 말 그대로 View를 관리하는 컨트롤러 역할을 수행한다.
  • 화면 전환, 데이터 전달, 뷰의 생명주기 관리 등을 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 사이의 데이터 흐름까지 조율하는 역할을 수행한다.

2-1. ViewController가 하는 일

역할설명
뷰 관리화면에 올라가는 View들을 만들고 관리 (addSubview 등)
데이터와 뷰 연결 (MVC의 C 역할)Model(데이터) → View로 전달해서 화면에 보여주고, View에서 발생한 액션 → Model로 전달
화면 전환 관리present, dismiss, navigation push/pop 등을 담당
메모리 관리메모리 부족할 때 뷰 내리고 다시 불러오는 작업 (didReceiveMemoryWarning)
사용자 인터랙션 처리버튼 클릭, 스와이프 같은 이벤트 처리

2-2. ⭐ UIViewController의 생명주기(LifeCycle)

→ iOS에서 화면(View)이 어떻게 만들어지고 사라지는지 순서대로 정리한다.

메서드언제 호출되는가?용도
init()뷰컨이 만들어질 때 (코드로 생성하면 여기부터 시작)변수 초기화
loadView()시스템이 View 만들 때직접 커스텀 View 만들고 싶을 때 override
viewDidLoad()View가 메모리에 올라왔을 때 (딱 한 번)UI 초기 설정, 데이터 바인딩
viewWillAppear()화면에 보이기 직전화면에 맞게 데이터 새로고침
viewDidAppear()화면 완전히 보일 때애니메이션 시작, API 호출 등
viewWillDisappear()다른 화면으로 넘어가기 직전저장해야 할 거 처리
viewDidDisappear()화면에서 완전히 사라졌을 때타이머 멈추기, 리소스 정리
deinit()메모리에서 완전 해제될 때메모리 정리, 관찰자 해제
  • ⭐ viewDidLoad() 는 딱 1번만 호출된다. (초기 세팅용)
  • ⭐ viewWillAppear() , viewDidAppear() 는 화면이 그려질 때 마다 호출된다.
  • ⭐ API 호출, 화면 그리기 타이밍 등 ViewController에서 조절한다.
  • ⭐ deinit() 를 잡지 않으면 메모리 누수(retain cycle)이 생겨 앱이 죽을 수 있다.

2-2-1. 기본 UIViewController 생명주기 코드 예시

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-3. UIViewController의 생명주기 순서

→ 2-2-1.에서 작성한 예시 코드를 실행했을 때 아래와 같이 콘솔에 출력된다.

  • 💡 이를 통해서 생명주기의 흐름을 파악한다.
👉 init() 호출
👉 loadView() 호출
👉 viewDidLoad() 호출
👉 viewWillAppear() 호출
👉 viewDidAppear() 호출

(화면 전환해서 사라지면 아래가 호출)
👉 viewWillDisappear() 호출
👉 viewDidDisappear() 호출
👉 deinit() 호출 - 메모리에서 사라짐

✅ 요약

  • View와 ViewController의 정의
역할View (UIView)ViewController (UIViewController)
정의화면에 보이는 요소UI 관리하는 관리자
하는 일그림 그리고 터치 받음화면 전환, 데이터 전달, 생명주기 관리
공식 문서에서 정의하는 것"그리기와 이벤트 처리""View 관리하고 데이터 모델 연결"
  • ViewController의 생명주기의 주요 메서드 요약
    • viewDidLoad() → 화면에 그려질 때 최초 1회만 호출
    • viewWillAppear() , viewDidAppear() → 화면이 그려질 때 마다 호출
    • viewWillDisappear() , viewDidDisappear() → 화면에서 사라질 때 마다 호출
    • deinit() → 메모리에서 완전히 해제될 때 호출
      • 💡 만약, 실행이 안된다면 메모리 누수를 의심해야한다.
profile
열심히 살아야지

0개의 댓글