[iOS & Swift 5.3+] @main : type๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ 

2021. 4. 1. 19:43ใ†๐Ÿง‘๐Ÿป‍๐Ÿ’ป iOS ๊ฐœ๋ฐœ/iOS

iOS ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒŒ์ผ์ด ์žˆ์ฃ ? ๊ทธ ์ค‘์—์„œ "AppDelegate.swift"๋Š” AppDegate ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์•ฑ์ด ์‹œ์ž‘๋˜๋Š” ์ง„์ž…์ ์„ ์•Œ๋ ค์ฃผ๊ณ  ์•ฑ์˜ ์ž…๋ ฅ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Ÿฐ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด AppDelegate์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๋ ค๊ณ  ๋ธ”๋กœ๊ทธ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋Š” ๊ณผ์ •์—์„œ Swift๊ฐ€ 5.3๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์˜ entry point๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์†์„ฑ์ด @UIApplicationMain์—์„œ @main์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์‚ฌํ•ญ์€ Xcode 12๋ถ€ํ„ฐ ์ ์šฉ์ด ๋˜์—ˆ์ฃ !

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. 

๊ธฐ์กด Xcode 11์—์„œ์˜ @UIApplication
Xcode 12๋ถ€ํ„ฐ ์ ์šฉ๋œ @main ์†์„ฑ

 

ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ Apple์˜ swift-evolution ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— 2020๋…„ 3์›”์— ์ฒ˜์Œ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

์†Œ๊ฐœ๊ธ€์„ ๋ณด์‹œ๋ฉด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ž‘ ์‹œ ์ง„์ž…์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์Šค์œ„ํ”„ํŠธ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํƒ‘ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ๋Œ€์‹  ์‚ฌ์šฉ์ž๋Š” single type์— @main ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ์š”. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋กœํ† ์ฝœ๊ณผ ํด๋ž˜์Šค ์ƒ์†์„ ํ†ตํ•ด ์•ฑ์˜ ์ง„์ž…์ ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ผ๊นŒ์š”? 

๊ทธ๋Ÿฌ๋ ค๋ฉด ๋จผ์ € ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์ดํ•ด๋ฅผ ํ•ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. 

์Šค์œ„ํ”„ํŠธ ๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” Swift ์†Œ์Šค ํŒŒ์ผ์•ˆ์—์„œ ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋Š” 0๊ฐœ ์ด์ƒ์˜ ์„ ์–ธ์ด๋‚˜ ์ •์˜ ๊ทธ๋ฆฌ๊ณ  ํ‘œํ˜„์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์ŠคํŒŒ์ผ์˜ ํƒ‘ ๋ ˆ๋ฒจ์—์„œ ์„ ์–ธ๋œ ๊ฒƒ๋“ค์€ ๊ฐ™์€ ๋ชจ๋“ˆ๋‚ด์˜ ๋ชจ๋“  ์†Œ์ŠคํŒŒ์ผ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

์ด ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํƒ‘ ๋ ˆ๋ฒจ ์„ ์–ธ(top-level declarations)๊ณผ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ(excutable top-level code)์ธ๋ฐ์š”.

์ด ์ค‘ ์†Œ๊ฐœ๊ธ€์—์„œ ์˜๋ฏธํ•˜๋Š” ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋Š” ์‹คํ–‰๊ฐ€๋Šฅํ•œ ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ค์ง ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ ์œผ๋กœ์„œ๋งŒ ํ—ˆ์šฉ๋œ๋‹ต๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฌ๋‹ˆ ์ฒ˜์Œ์— ์˜๋ฏธํ•œ ํƒ‘ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋Š” ๊ธฐ์กด์˜ ์ง„์ž…์ ์„ ์•Œ๋ ค์ฃผ๋Š” @UIApplicationMain์†์„ฑ์ด์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

@UIApplicationMain

Objective-C ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” "main.m" ์†Œ์ŠคํŒŒ์ผ์— ์žˆ๋Š” main()ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๊ณ  Swift๊ธฐ๋ฐ˜์˜ Xcode ํ”„๋กœ์ ํŠธ์—์„œ Mac ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ "main.swift" ํŒŒ์ผ์„ ํฌํ•จํ•˜์—ฌ mainํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Xcode์—์„œ ์ƒˆ iOS ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์•ฑ์ด ์–ด๋””์„œ ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š”์ง€ ์•Œ๊ธฐ์œ„ํ•ด main() ํ•จ์ˆ˜ ํ˜น์€ "main.swift" ํŒŒ์ผ์„ ์ฐพ์•„ ๋ณด๋ฉด, ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” iOS ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์—์„  SwiftํŒŒ์ผ์— @UIApplicationMain์„ ํฌํ•จํ•จ์œผ๋กœ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ iOS ์•ฑ์˜ ์ง„์ž…์ ์„ ํ•ฉ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ "main.swift"ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  main()ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. Swift๊ธฐ๋ฐ˜์˜ iOSํ”„๋กœ์ ํŠธ์—์„œ๋Š” UIKit ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋ฅผ ์ˆจ๊ฒจ์„œ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ฐพ๊ธฐ ํž˜๋“ค์—ˆ๋˜ ๊ฒƒ์ด์ง€์š”.

UIApplicationMain ํ•จ์ˆ˜

@UIApplicationMain์€ UIApplicationMain ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ์•ฑ ์‹คํ–‰์—์„œ ์ค‘์š”ํ•œ ๋ช‡ ๊ฐ€์ง€์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ฑ์˜ ๋ณธ์ฒด์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์ธ UIApplicaion๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ์ด ๊ฐ์ฒด๋Š” ์•ฑ์˜ Life Cycle์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์ •๋œ ํด๋ž˜์Šค(@UIApplicationMain์ด ํ‘œ์‹œ๋œ)์—์„œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•˜๊ณ  ์ด๋ฅผ ์•ฑ์˜ ๊ฐ์ฒด์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์˜ Run Loop์„ ํฌํ•จํ•œ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ์ฒ˜๋ฆฌ ๋ฃจํ”„๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์˜ info.plist์— ๋ถˆ๋Ÿฌ์˜ฌ main nibํŒŒ์ผ์ด ์ œ๋Œ€๋กœ ๋ช…์‹œ๋˜์–ด์žˆ์œผ๋ฉด, ํ•ด๋‹น nibํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค (์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.)

 

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ํƒ€์ž…์ด Int32๋กœ ๋ช…์‹œ๋˜์–ด์žˆ์ง€๋งŒ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. 

๊ทธ๋Ÿผ @UIApplicationMain์˜ ์—ญํ• ๊ณผ ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ ์™œ @main์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

@main

์Šค์œ„ํ”„ํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ์†Œ์ŠคํŒŒ์ผ์˜ ์‹œ์ž‘์  ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์—†์ด ์ ˆ์ฐจ์  ์ฝ”๋“œ์—์„œ ํ›Œ๋ฃกํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž์šฉ ์•ฑ์˜ ๊ฒฝ์šฐ ์ข…๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰๋˜๊ณ  UIKit ๋ฐ AppKit๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์˜ ๋ณต์žก์„ฑ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์•ฑ ๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ์œ„ํ•œ ๊ณ ๊ธ‰ API ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ ์‹คํ–‰์˜ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์‹œ์ž‘์ ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ๊ฑฐ๋‚˜ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๋ชจ๋ธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์€ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ์‹œ์ž‘์ ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์†Œ๋Ÿ‰์˜ "๋ถ€ํŒ… ๋กœ๋”ฉ" ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ๋˜์ฃ . ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค ์ดํ›„ Swift๋Š” UIKit ๋ฐ AppKit ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด ์ด ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด @UIApplicationMain ๋ฐ @NSApplicationMain ๋„๋ฉ”์ธ์ด ๋ช…์‹œ๋œ ์†์„ฑ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ (ํ•˜๋“œ ์ฝ”๋“œ๋œ?) ํ”„๋ ˆ์ž„์›Œํฌ์— ์—ฐ๊ฒฐ๋œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค ์ง€์ •๋œ ํƒ€์ž…(@main์œผ๋กœ ๋ช…์‹œ๋œ)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ด๊ณ  ๊ฐ€๋ฒผ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ์ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์Šค์œ„ํ”„ํŠธ์˜ ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŒจํ„ด์— ๋” ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ‘œ์ค€ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊น”๋”ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ง„์ž…์  API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๋Š”๊ตฐ์š”.

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ @main์„ ์‚ฌ์šฉํ•˜์—ฌ Swift ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ (entry point)์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Swift ์ปดํŒŒ์ผ๋Ÿฌ๋Š” @main์ด ๋‹ฌ๋ฆฐ ํƒ€์ž… struct MyProgram์„ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ ์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ์ด ํƒ€์ž…์€ ์ •์  main()๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ํ•˜๋‚˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋ฉด @main์œผ๋กœ ํ‘œ์‹œ๋œ ํƒ€์ž…์—์„œ ์ •์  main ()๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ง์ ‘ iOS ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ ์„ ์ง์ ‘ ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ AppDelegate๋ผ๋Š” ํ…Œ์ŠคํŠธ iOS ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์•ฑ์˜ ์ง„์ž…์ ์ด ๋  EntryPoint ํƒ€์ž…๊ณผ ์ •์  main()ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  EntryPointProtocol์„ ๋”ฐ๋กœ Swift ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. 

๋จผ์ € AppDelegate.swift ํŒŒ์ผ์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜์ž๋ฉด @main๋กœ ํ‘œ์‹œํ•ด์คŒ์œผ๋กœ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ ์€ AppDelegate ํด๋ž˜์Šค์ด๊ณ  UIApplicationDelegate ํ”„๋กœํ† ์ฝœ์— ์ž‘์„ฑ๋œ ์ •์  main() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ๋Ÿผ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด @main์†์„ฑ์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•ฑ ๋Ÿฐ์นญ์ด ์™„๋ฃŒ๋  ๊ฒฝ์šฐ ์ถœ๋ ฅ๋  print ๋ฌธ์„ ์ž‘์„ฑํ•ด ๋†“๊ฒ ์Šต๋‹ˆ๋‹ค..

๊ทธ๋ฆฌ๊ณ  ์ž‘์„ฑํ•œ EntryPointProtocol์— ์ •์  main()ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  EntryPoint ํƒ€์ž…์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ ์„ ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

EntryPointProtocol์— ์ •์  ๋ฉ”์„œ๋“œ์ธ main()์„ ์ž‘์„ฑํ•˜๊ณ  EntryPoint์—์„œ ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  main()๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

EntryPoint ํƒ€์ž… ์œ„์— @main์†์„ฑ์„ ๋ช…์‹œํ•จ์œผ๋กœ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง„์ž…์ ์„ ํ‘œ์‹œํ•˜๊ณ  ์ฑ„ํƒํ•œ ํ”„๋กœํ† ์ฝœ์˜ ํƒ€์ž… ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํ›„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋˜๊ณ  ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์•ฑ์ด ๋Ÿฐ์นญ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AppDelegate์˜ mainํ•จ์ˆ˜๋Š” UIApplicationMain ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์œ„์— ์ •๋ฆฌํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์ˆ˜ํ–‰๋˜๊ณ  ๋‚˜์„œ ์•ฑ์ด ์‹คํ–‰๋˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๊ธฐ์กด์˜ @UIApplicationMain ์†์„ฑ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†์„๊นŒ์š”?

์ด๋ ‡๊ฒŒ ๊ธฐ์กด์˜ @UIApplicationMain์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด class ์„ ์–ธ์—๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ •๋ฆฌ

@UIApplicationMain๋Œ€์‹  @main์†์„ฑ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ์Šค์œ„ํ”„ํŠธ ์ฝ”๋“œ์—์„œ ์ด์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ ์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ณ  main()ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ ์ •์  ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ํ”„๋กœํ† ์ฝœ์—์„œ ํ™•์žฅ ๋ฉ”์„œ๋“œ ๋˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ์ถ”๊ฐ€ ์–ธ์–ด ๊ธฐ๋Šฅ ์—†์ด๋„ ์‚ฌ์šฉ์ž ์ง€์ • ์ง„์ž…์  ๋™์ž‘์„ ์‰ฝ๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. 

์–ด๋–ค UI ํ”„๋ ˆ์ž„์›Œํฌ์ด๋˜ ์ƒ๊ด€์—†์ด ํŠน์ •ํ•œ ๋ชฉ์ ์„ ์œ„ํ•œ ์†์„ฑ(UIKitd์™€ AppKit์˜ @UIApplicationMain ๋ฐ @NSApplicationMain)๋ณด๋‹ค @main์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ์ผ๊ด€์„ฑ์„ ์ถ”๊ตฌํ•˜๊ณ  ๋”์šฑ ๊ฐ„ํŽธํ•œ ์ง„์ž…์ ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ณต์‹๋ฌธ์„œ์™€ ์˜์–ด์ž๋ฃŒ๋ฅผ ํ•ด์„ํ•˜๋ฉด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•˜์˜€๊ธฐ์— ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!


์ฐธ๊ณ ์ž๋ฃŒ