본문 바로가기
iOS (Swift)

[오늘의 코드 조각] [iOS 3-4] ViewController의 일생: 안드로이드와 비교하는 iOS Lifecycle 완벽 이해

by 생각하는 개발자님 2026. 7. 13.
반응형

안녕하세요! [생각하는 개발자]입니다.

지난 시간까지 우리는 스토리보드와 UIStackView를 활용해 눈에 보이는 화면을 근사하게 조립해 보았습니다. 화면을 예쁘게 그렸다면, 이제 이 화면이 언제 메모리에 올라오고, 언제 눈에 보이며, 언제 사라지는지 그 '시간의 흐름'을 통제할 수 있어야 합니다.

이 흐름을 우리는 뷰 컨트롤러 생명주기(View Controller Lifecycle)라고 부릅니다. 면접관들이 단골로 묻는 질문이면서, 현업에서 데이터 로딩 타이밍을 잡을 때 가장 먼저 열어보는 설계도이기도 합니다.

3_4 ViewController 생명주기 5대 메서드
3_4 ViewController 생명주기 5대 메서드

3.4.1 캔버스 위에 재료 얹기 (메서드 트리거 배치)

생명주기를 이해하는 가장 좋은 방법은 코드로 직접 타이밍을 확인하는 것입니다. ViewController.swift 파일을 열고, 아래의 기본 메서드(Method)들을 재료 삼아 배치해 봅니다. 각 단계마다 print 문을 심어 시뮬레이터가 구동될 때 콘솔창에 찍히는 순서를 관찰할 준비를 합니다.

--- 테스트 소스 ---

import UIKit

class ViewController: UIViewController {

    // 3.4.2 단계별 실습을 위한 뼈대 배치
    override func viewDidLoad() {
        super.init()
        print("1. viewDidLoad - 메모리에 로드됨")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("2. viewWillAppear - 화면이 나타날 예정")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("3. viewDidAppear - 화면이 완전히 나타남")
    }
}

3.4.2 [단계별 실습] 뷰 컨트롤러의 일생을 관통하는 5대 메서드

앱을 켜고 끌 때, 혹은 다른 화면으로 전환될 때 iOS 시스템은 아래의 메서드들을 정해진 순서대로 알아서 호출해 줍니다.

 

1단계: 생성과 메모리 로드 (viewDidLoad)

  • 타이밍: 뷰 컨트롤러의 도화지(View)가 메모리에 처음으로 얹어질 때 딱 한 번만 호출됩니다.
  • 실무 활용: 화면이 켜지는 동안 변수를 초기화하거나, 3-2장에서 만든 UI 디자인의 초기 상태(버튼 둥글게 깎기 등)를 세팅할 때 사용합니다. 네트워킹 데이터를 미리 당겨올 때도 주로 사용됩니다.

2단계: 등장 예고 (viewWillAppear)

  • 타이밍: 뷰가 화면에 나타나기 직전에 호출됩니다. 화면을 전환했다가 다시 돌아올 때도 매번 호출됩니다.
  • 실무 활용: 화면이 열릴 때마다 실시간으로 갱신되어야 하는 데이터(예: 알림 읽음 표시, 유저 프로필 최신화) 처리나 화면 애니메이션을 준비할 때 적합합니다.

3단계: 등장 완료 (viewDidAppear)

  • 타이밍: 뷰가 스크린에 완전히 그려진 직후에 호출됩니다.
  • 실무 활용: 화면이 뜨자마자 특정 텍스트 필드에 포커스를 주어 키보드를 자동으로 올리거나(becomeFirstResponder), 타이머를 구동할 때 사용합니다. 화면이 보이지도 않는데 키보드부터 뜨면 UX(사용자 경험)가 깨지기 때문입니다.

4단계: 퇴장 예고 (viewWillDisappear) & 5단계: 퇴장 완료 (viewDidDisappear)

  • 타이밍: 유저가 뒤로 가기 버튼을 누르는 등 화면이 사라지기 직전과 직후에 호출됩니다.
  • 실무 활용: 화면이 닫힐 때 백그라운드에서 돌고 있던 무거운 음악 재생을 멈추거나, 리소스 낭비를 막기 위해 센서 수신을 해제할 때 사용합니다.

👨‍💻 안드로이드 개발자를 위한 비교 조각

안드로이드의 Activity 생명주기를 다뤄보신 분들이라면 1:1 매핑이 머릿속에 바로 그려지실 겁니다.

  • 안드로이드의 레이아웃을 바인딩하는 onCreate() 시점은 iOS의 viewDidLoad와 정확히 닮아 있습니다.
  • 화면이 가려졌다 다시 뜰 때 호출되는 onStart() -> onResume()의 흐름은 iOS의 viewWillAppear() -> viewDidAppear()와 매칭됩니다.
  • 자원을 해제하는 onPause() -> onStop()은 viewWillDisappear() -> viewDidDisappear()의 거울과 같습니다.

플랫폼 이름과 함수명은 달라도, **"컴퓨터 메모리를 효율적으로 아끼면서 화면을 매끄럽게 보여주겠다"**는 운영체제(OS)의 엔지니어링 철학은 완전히 동일합니다.

🎯 오늘의 요약

  • viewDidLoad는 메모리 탑재 시점에 단 한 번만 실행되므로 초기화에 집중한다.
  • 화면이 다시 나타날 때마다 반복 실행되어야 하는 로직은 viewWillAppear에 위치시킨다.
  • 유저의 눈에 화면이 완벽히 보이는 시점인 viewDidAppear 이후에 인터랙션을 제어한다.

뷰의 일생을 내 손안에 쥐고 있어야 메모리 누수(Memory Leak)가 없는 건강한 앱을 만들 수 있습니다.

다음 장 [iOS 3-5]에서는 화면 내부를 넘어, 드디어 화면과 화면 사이를 넘나드는 데이터 전달의 정석(Property, Delegate)을 다루며 앱의 스케일을 키워보겠습니다. 생각하는 개발자가 되어 다음 단계로 넘어가 봅시다!

반응형