๐—ถ๐—ข๐—ฆ/๐Ÿ iOS ๊ฐœ๋…ํŽธ

[iOS / Swift] ์ƒ๋ช…์ฃผ๊ธฐ(Life Cycle)๋ž€?

z_ero 2025. 10. 16. 17:57

๐ŸŽ ์ƒ๋ช…์ฃผ๊ธฐ(Life Cycle)๋ž€?

์ƒ๋ช…์ฃผ๊ธฐ(Life Cycle)๋ž€ ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์™„์ „ํžˆ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€

์•ฑ์ด ์–ด๋–ค ์ƒํƒœ(state)์— ์žˆ๊ณ , ๊ทธ ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”๋˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

 

์•ฑ์€ ์‹คํ–‰ ์ค‘์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์ž ์‹œ ๋ฉˆ์ถฐ ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์™„์ „ํžˆ ์ข…๋ฃŒ๋œ ์ƒํƒœ์ผ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ~

์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ์ƒํƒœ๋Š” ์•ฑ์ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์—†๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด ์•ฑ์ด ์–ธ์ œ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์–ธ์ œ ๋ฉˆ์ถ”๋ฉฐ,
์–ธ์ œ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋˜๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด ์•ฑ์˜ ๋™์ž‘ ํ๋ฆ„์„ ์˜ˆ์ธกํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

๐ŸŽ ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ(App’s Life Cycle) ๋ž€?

์•ฑ์ด ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๋•Œ, ๊ทธ๋ฆฌ๊ณ  Foreground(ํ™”๋ฉด์— ๋ณด์ด๋Š” ์ƒํƒœ)์™€ Background(ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” ์ƒํƒœ)๋ฅผ ์˜ค๊ฐˆ ๋•Œ๋งˆ๋‹ค ์‹œ์Šคํ…œ์ด ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ์— ์˜ํ•ด ์•ฑ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ณ ,

์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์•ฑ์˜ ์•ˆ์ •์ ์ธ ์‹คํ–‰๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!!

๐ŸŽ ์•ฑ์˜ ์ƒํƒœ (App State)

์•ฑ์˜ ์ƒํƒœ๋Š” ์ด ๋‹ค์„ฏ ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ์š”.

๊ฐ ์ƒํƒœ๋Š” ์•ฑ์ด ํ˜„์žฌ ์–ด๋–ค ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  • Not Running
    • ์•ฑ์ด ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์–ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์•ฑ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Foreground – Inactive
    • ์•ฑ์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ณ  ์žˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜๋˜๊ฑฐ๋‚˜ ์ „ํ™”๋‚˜ ์•Œ๋ฆผ์ด ๋„์ฐฉํ–ˆ์„ ๋•Œ ์ด ์ƒํƒœ๋กœ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • Foreground – Active
    • ์•ฑ์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • ์•ฑ์ด ์‹คํ–‰๋œ ์งํ›„ ๋ฐ”๋กœ Active ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ,
    • ๋ฐ˜๋“œ์‹œ Inactive ์ƒํƒœ๋ฅผ ๊ฑฐ์ณ Active๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • Background – Running
    • ์•ฑ์ด ํ™”๋ฉด์—๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์Œ์•… ์•ฑ์ด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ ธ๋„ ๋…ธ๋ž˜๊ฐ€ ๊ณ„์† ์žฌ์ƒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋‚˜ ํƒ€์ด๋จธ ๋™์ž‘ ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Background – Suspended
    • ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•œ ๋’ค ์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๋‚จ์•„ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • ์ด ์ƒํƒœ์—์„œ๋Š” ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ, ์ตœ๊ทผ ์‹คํ–‰ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜์—ฌ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ Background ์ƒํƒœ๋กœ ์ „ํ™˜๋œ ํ›„ 2~3์ดˆ ๋‚ด์— Suspended๋กœ ์ง„์ž…ํ•˜๋ฉฐ,
    • iOS์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์•ฑ์„ “์ข…๋ฃŒํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„”, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐ŸŽ iOS 13 ์ด์ „: App-Based Life Cycle

iOS 13 ์ด์ „์—๋Š” ์•ฑ(App) ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์กŒ์œผ๋ฉฐ, ๋ชจ๋“  ์ƒํƒœ ๋ณ€ํ™” ์ด๋ฒคํŠธ๋Š” UIApplicationDelegate๊ฐ€ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์˜ ์‹คํ–‰, ์ข…๋ฃŒ, ํฌ๊ทธ๋ผ์šด๋“œ·๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ „ํ™˜ ๋“ฑ ์•ฑ ์ „๋ฐ˜์˜ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์•ฑ ์ „์ฒด UI์— ์ง์ ‘ ์˜ํ–ฅ์„ ๋ฏธ์ณค๊ณ ,

๋ชจ๋“  ํ™”๋ฉด(ViewController)๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜๋‚˜์˜ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค.

iOS 13 ์ด์ „์˜ ์ƒํƒœ ์ „ํ™˜ ํ๋ฆ„

์•„๋ž˜๋Š” Apple ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜จ iOS 13 ์ด์ „์˜ ์•ฑ ์ƒํƒœ ์ „ํ™˜๋„์ž…๋‹ˆ๋‹ค!

  • Not Running: ์•ฑ์ด ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ข…๋ฃŒ๋œ ์ƒํƒœ
  • Inactive: ์•ฑ์ด ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ (์ „ํ™”, ์•Œ๋ฆผ ๋“ฑ)
  • Active: ์•ฑ์ด ํ™”๋ฉด์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
  • Background: ์•ฑ์ด ํ™”๋ฉด์—๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ
  • (์˜ˆ: ์Œ์•… ์•ฑ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žฌ์ƒ, ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋“ฑ)
  • Suspended: ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋œ ๋’ค, ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๋‚จ์•„ ์žˆ๋Š” ์ƒํƒœ

์ฆ‰, ์•ฑ์€ Not Running → Inactive → Active ๋˜๋Š” Active → Inactive → Background → Suspended ํ˜•ํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŽ  iOS 13 ๋ฒ„์ „ ํ˜น์€ ๊ทธ ์ดํ›„ ๋ฒ„์ „ : Scene ์‚ฌ์šฉ

์ด์ „๊นŒ์ง€๋Š” ํ•˜๋‚˜์˜ ์•ฑ์ด ํ•˜๋‚˜์˜ ํ™”๋ฉด(UI)๋งŒ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ์˜€์ง€๋งŒ, iOS 13๊ณผ ํ•จ๊ป˜ iPadOS๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์ด ๊ฐœ๋…์ด ์™„์ „ํžˆ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

iPad์—์„œ ํ•˜๋‚˜์˜ ์•ฑ์„ ๋‘ ์ฐฝ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ—˜์ด ์žˆ๋‚˜์š”?

์ด๋Š” iOS 13๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ์•ฑ ์•ˆ์—์„œ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ™”๋ฉด(Scene)์„ ๋™์‹œ์— ๋„์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ์•ฑ์€ ๋” ์ด์ƒ “ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ™”๋ฉด๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ตฌ์กฐ”๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ Scene์„ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.

iOS 13 ์ด์ „์—๋Š” ๋ชจ๋“  ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๋ฅผ AppDelegate๊ฐ€ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ, ์ด์ œ๋Š” ์—ญํ• ์ด ๋ถ„๋ฆฌ๋˜์–ด SceneDelegate๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ด๋‹น ๊ฐ์ฒด ์—ญํ•  ์„ค๋ช…
AppDelegate ์•ฑ ์ „์ฒด์˜ ์‹คํ–‰, ์ข…๋ฃŒ, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์•ฑ ๋‹จ์œ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
SceneDelegate UI ํ‘œ์‹œ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ํ™”๋ฉด(Scene) ๋‹จ์œ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ

 

์•ฑ(App)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” AppDelegate๊ฐ€, UI(Scene)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” SceneDelegate๊ฐ€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

์•ฑ์ด Scene์„ ์ง€์›ํ•˜๋ฉด, ๊ฐ Scene์˜ UI ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ๋Š” SceneDelegate๊ฐ€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Scene์€ ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์•ฑ ํ™”๋ฉด์˜ ํ•œ ์ธ์Šคํ„ด์Šค๋กœ, ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ ์•ฑ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ Scene์„ ๋„์šฐ๊ฑฐ๋‚˜ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ Scene์€ ๋…๋ฆฝ์ ์ธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ, ํ•œ Scene์ด Foreground์— ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ Scene์€ Background์— ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋‚˜ ์‹œ์Šคํ…œ์ด ์ƒˆ Scene์„ ์š”์ฒญํ•˜๋ฉด

UIKit์ด Scene์„ ์ƒ์„ฑํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ Scene์€ Foreground๋กœ, ์‹œ์Šคํ…œ์ด ๋งŒ๋“  Scene์€ Background์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค!

 

๐ŸŸข ์•ฑ ์‹คํ–‰

์•ฑ์ด ์‹คํ–‰๋˜๊ณ  ํ™”๋ฉด์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

application(_:didFinishLaunchingWithOptions:)
  • ์•ฑ ์ดˆ๊ธฐ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • (์˜ˆ: ์„ค์ •๊ฐ’ ๋กœ๋“œ, ์˜์กด์„ฑ ์ฃผ์ž…, ์ดˆ๊ธฐ UI ๊ตฌ์„ฑ ๋“ฑ)

๐ŸŸ  Scene ์—ฐ๊ฒฐ

์•ฑ์ด ์‹คํ–‰๋˜๋ฉด UIKit์ด Scene์„ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

application(_:configurationForConnecting:options:)
  • ์ƒˆ๋กœ์šด Scene์„ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • UISceneConfiguration ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด delegate ์ง€์ • ๋ฐ Scene ๊ด€๋ จ ์ •๋ณด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณดํ†ต Info.plist์— ๋“ฑ๋ก๋œ ๊ธฐ๋ณธ ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
scene(_:willConnectTo:options:)
  • Scene์ด ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ „์—๋Š” AppDelegate์˜ didFinishLaunchingWithOptions์—์„œ UIWindow๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ,
  • ์ด์ œ๋Š” ์ด ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Storyboard๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ UIKit์ด ์ž๋™์œผ๋กœ UIWindow๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
sceneDidBecomeActive(_:)
  • Scene์ด Inactive → Active ์ƒํƒœ๋กœ ์ „ํ™˜๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ต ํ™ˆ ํ™”๋ฉด์œผ๋กœ ์ด๋™ (Active → Inactive → Background)

์•ฑ ์‹คํ–‰ ํ›„ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๋‚˜๊ฐ€๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

sceneWillResignActive(_:)
  • Scene์ด Active → Inactive ์ƒํƒœ๋กœ ์ „ํ™˜๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • (์˜ˆ: ์ „ํ™” ์ˆ˜์‹ , ์•Œ๋ฆผ ํ‘œ์‹œ ๋“ฑ)
sceneDidEnterBackground(_:)
  • Scene์ด Background๋กœ ์ง„์ž…ํ•  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • (์˜ˆ: ๋ฐ์ดํ„ฐ ์ €์žฅ, ๋ฆฌ์†Œ์Šค ํ•ด์ œ, ์ƒํƒœ ๋ณต์› ์ฒ˜๋ฆฌ ๋“ฑ)

๐ŸŸฃ ์•ฑ์œผ๋กœ ๋ณต๊ท€ (Background → Inactive → Active)

๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋˜ ์•ฑ์ด ๋‹ค์‹œ ์‹คํ–‰๋˜๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

sceneWillEnterForeground(_:)
  • Scene์ด Background → Inactive๋กœ ์ „ํ™˜๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • (UI ๊ฐฑ์‹  ์ค€๋น„, ํ™”๋ฉด ๋ณต์› ๋“ฑ)
sceneDidBecomeActive(_:)
  • Scene์ด ๋‹ค์‹œ Active ์ƒํƒœ๋กœ ๋ณต๊ท€ํ•  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”ด Scene ์—ฐ๊ฒฐ ํ•ด์ œ

๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ํ™”๋ฉด(App Switcher)์—์„œ Scene์„ ๋‹ซ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

iOS 13 ์ดํ›„์—๋Š” ํ•˜๋‚˜์˜ ์•ฑ์ด ์—ฌ๋Ÿฌ Scene์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,

๋ชจ๋“  Scene์ด ํ•ด์ œ๋˜์–ด์•ผ ์•ฑ์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

sceneDidDisconnect(_:)
  • ํŠน์ • Scene์˜ ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
application(_:didDiscardSceneSessions:)
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ํ™”๋ฉด์—์„œ ํ•œ ๊ฐœ ์ด์ƒ์˜ Scene์„ ์ข…๋ฃŒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
applicationWillTerminate(_:)
  • ์•ฑ์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹จ, ์‹œ์Šคํ…œ์ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•  ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽ ViewController ์ƒ๋ช…์ฃผ๊ธฐ

 

ViewController๋Š” iOS ์•ฑ์—์„œ ํ™”๋ฉด ๋‹จ์œ„๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋กœ, ํ•˜๋‚˜์˜ ํ™”๋ฉด์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜ค๊ณ  ์‚ฌ๋ผ์ง€๋Š” ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

์ด ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋ทฐ๊ฐ€ ์–ธ์ œ ์ƒ์„ฑ๋˜๊ณ , ์–ธ์ œ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋ฉฐ, ์–ธ์ œ ์‚ฌ๋ผ์ง€๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ์ ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

loadView

loadView๋Š” ๋ทฐ(View)๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋Š” ์‹œ์ ์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ž์‹ ๋งŒ์˜ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๋ทฐ๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์‹œ์ ์ž…๋‹ˆ๋‹ค.

iOS์—์„œ ๊ฐ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UIView ์ธ์Šคํ„ด์Šค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ loadView๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ๋ทฐ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณดํ†ต ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, loadView ์•ˆ์—์„œ ๋ฃจํŠธ ๋ทฐ๋ฅผ ์ง์ ‘ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, loadView๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • super.loadView()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • loadView๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ ๋ทฐ ์ƒ์„ฑ ๋กœ์ง์ด ๋Œ€์ฒด๋˜๋ฏ€๋กœ, super๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜๋“œ์‹œ self.view์— ์ƒˆ๋กœ์šด ๋ฃจํŠธ ๋ทฐ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋กœ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

override func loadView() {
    let rootView = UIView()
    rootView.backgroundColor = .white
    self.view = rootView
}

์ด์ฒ˜๋Ÿผ loadView๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฃจํŠธ ๋ทฐ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

viewDidLoad

viewDidLoad๋Š” ๋ทฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์™„์ „ํžˆ ์˜ฌ๋ผ์˜จ ์งํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์ฃผ๋กœ ์ดˆ๊ธฐ ์„ค์ •๊ณผ UI ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—๋Š” ๋ทฐ์˜ ๋ชจ๋“  ์•„์›ƒ๋ ›์ด ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์„œ๋ธŒ๋ทฐ ์ถ”๊ฐ€, ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ setUI(), setLayout(), addTarget()๊ณผ ๊ฐ™์€ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜๊ณ , viewDidLoad์—์„œ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

viewWillAppear

viewWillAppear๋Š” ๋ทฐ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ธฐ ์ง์ „ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

viewDidLoad๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ์ด ๋ฉ”์„œ๋“œ๋Š” ๋ทฐ๊ฐ€ ๋‹ค์‹œ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด๊ณ  ๋Œ์•„์™”์„ ๋•Œ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด ์‹œ์ ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์นด์นด์˜คํ†ก์˜ ์ฑ„ํŒ…๋ฐฉ ๋ชฉ๋ก์—์„œ ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜, ์˜ˆ์•ฝ ์•ฑ์—์„œ ๋ณ€๊ฒฝ๋œ ์ขŒ์„ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

viewDidAppear

viewDidAppear๋Š” ๋ทฐ๊ฐ€ ์‹ค์ œ๋กœ ํ™”๋ฉด์— ์™„์ „ํžˆ ํ‘œ์‹œ๋œ ์งํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ํƒ€์ด๋จธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ ํ™”๋ฉด ํ‘œ์‹œ ์ดํ›„ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

viewWillDisappear

viewWillDisappear๋Š” ๋ทฐ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ธฐ ์ง์ „ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜, ํƒ€์ด๋จธ๋ฅผ ๋ฉˆ์ถ”๋Š” ๋“ฑ ํ™”๋ฉด์ด ์‚ฌ๋ผ์ง€๊ธฐ ์ „ ๋งˆ๋ฌด๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

viewDidDisappear

viewDidDisappear๋Š” ๋ทฐ๊ฐ€ ํ™”๋ฉด์—์„œ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง„ ์งํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋ทฐ๋Š” ๋‹จ์ˆœํžˆ ํ™”๋ฉด์—์„œ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋œ ์ƒํƒœ์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ฆ‰, ํ•„์š” ์‹œ ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ViewController ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

iOS๋Š” ํ™”๋ฉด ์ „ํ™˜ ์‹œ์ ๋งˆ๋‹ค ๋‚ด๋ถ€์ ์œผ๋กœ ํŠน์ • ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ™”๋ฉด์˜ ํŠน์ • ์‹œ์ ์— ๋งž์ถฐ ์ ์ ˆํ•œ ์ž‘์—…์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

  • ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ธฐ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์‹ ํ™”ํ•ด์•ผ ํ•œ๋‹ค๋ฉด viewWillAppear,
  • ํ™”๋ฉด์ด ์™„์ „ํžˆ ํ‘œ์‹œ๋œ ํ›„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด viewDidAppear,
  • ํ™”๋ฉด์ด ์‚ฌ๋ผ์งˆ ๋•Œ ํƒ€์ด๋จธ๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด viewWillDisappear์™€ ๊ฐ™์ด
  • ์ƒํ™ฉ์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ํ™”๋ฉด์˜ ํ๋ฆ„์„ ์˜ˆ์ธกํ•˜๊ณ  ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด ํ™”๋ฉด ์ „ํ™˜, ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจํ™”๋ฅผ ๋ณด๋‹ค ์•ˆ์ •์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•