ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] @main ๊ณผ ์ปค์Šคํ…€ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ
    iOS/๐ŸŸ  Swift 2021. 1. 19. 13:54

    1์ฐจ ์ˆ˜์ •: 21.09.28

     

    ์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿถ

    ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” @main ํŠน์„ฑ (attribute) ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”๐Ÿ”ฅ


     

     A more general purpose and lightweight mechanism for delegating a program’s entry point to a designated type.

     

    @main ์˜ ๊ธฐ๋Šฅ

     

    @main ์€ ์Šค์œ„ํ”„ํŠธ 5.3๋ฒ„์ „์—์„œ ๊ตฌํ˜„๋œ ๋ฒ”์šฉ์ ์ธ ์ƒˆ๋กœ์šด ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ ์ œ๊ณต ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

     

    ์ด์ „์—๋Š” ์•ฑ ๊ฐœ๋ฐœ์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด์„œ๋Š” @UIApplicationMain ์ด๋ผ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

     

    @main ์ด ๋ฒ”์šฉ์ ์ธ ์ด์œ ๋Š”

    ๋‹จ์ผ ํŒŒ์ผ ์ฝ”๋“œ์ด๋˜ ํ”„๋ ˆ์ž„์›Œํฌ ํ”„๋กœ์ ์ด๋˜ ์ปค์Šคํ…€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋˜ ์ƒ๊ด€์—†์ด ๋™์ผํ•˜๊ฒŒ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

     

    ์Šค์œ„ํ”„ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” @main ์ด ์ ํžŒ [์‹ฑ๊ธ€ ๋…ผ ์ œ๋„ค๋ฆญ ํƒ€์ž…] ํ˜น์€ [main.swift ํŒŒ์ผ]์„ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋กœ ์ธ์ง€ํ•ฉ๋‹ˆ๋‹ค.๊ทผ๊ฑฐ

     

    ๋งŒ์•ฝ @main ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚จ ํƒ€์ž…์ด๋ผ๋ฉด,

     

    ์›ํ•˜๋Š” ํƒ€์ž… ์•ž์— @main ์„ ์ ์–ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์š”๊ตฌ์‚ฌํ•ญ์€ ์กฐ๊ธˆ ๋’ค์— ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    AppDelegate ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ @main์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘ ์ง€์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

     

    ์ด ๊ฐœ๋…์€ ๋‹จ์ผ ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ์ ˆ์ฐจ์  ์ฝ”๋“œ ๋ฅผ ์ž‘์„ฑ ํ•  ๋•Œ๋Š” ์•Œ์ง€ ๋ชปํ•ด๋„ ํฐ ์ƒ๊ด€์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ๋‹จ์ผ ํŒŒ์ผ ๊ธฐ๋ฐ˜์—์„œ๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋˜๋‹ˆ๊นŒ์š”!

     

    " top-down lexical order "

     

    ๋‹จ์ผ ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ์ ˆ์ฐจ์  ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์˜ˆ๋Š” Playgrounds ํŒŒ์ผ๋“ค ์ž…๋‹ˆ๋‹ค.

     

    ํŒŒ์ผ ํ•˜๋‚˜ ์ž์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹จ์œ„์ด๋ฉฐ, ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

     

    ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ

     

     

    ํ•˜์ง€๋งŒ UIKit ๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

     

    ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ํŒŒ์ผ์— ํƒ€์ž…๊ณผ ๊ทธ ๋ฉค๋ฒ„๋“ค๋งŒ '์„ ์–ธ' ํ–ˆ์„ ๋ฟ, ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‹คํ–‰์‹œํ‚ค๋Š” ์ง€๋Š” ์ „ํ˜€ ์ ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.


     

    AppDelegate: " ๋‚ด๊ฐ€ ์•Œ์•„์„œ ํ•ด์ค„๊ฒŒ "

     

    ์™œ์ผ๊นŒ์š”? ๋”ฐ๋กœ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

     

    ๊ธฐ๋ณธ์ ์œผ๋กœ AppDelegate ์ด ๊ทธ ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ํƒ€์ž…์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

     

    @main ์„ ์•ž์— ์ž‘์„ฑํ•˜์—ฌ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๊ฐ€ ๋œ ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

     

    '<TYPE>' is annotated with @main and must provide

    a main static function of type () -> Void or () throws -> Void.

     

     

    ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” main() ์„ ๋ณผ ์ˆ˜ ์—†์ฃ .  UIKit ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€์— ์ˆจ์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    AppDelegate ๋Š” ํ”„๋กœํ† ์ฝœ ํ™•์žฅ์„ ํ†ตํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„ ์œผ๋กœ static func main() ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

     

    >> ๊ด€๋ จ ๊ธ€: ํ”„๋กœํ† ์ฝœ ์ด์ •๋ฆฌ  <<

     

    ์‹œ์Šคํ…œ์€ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ main() ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    ์ด ์Šคํƒœํ‹ฑ ํ•จ์ˆ˜ main() ์ด ์–ด๋–ค ๋‚ด์šฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€๋Š” ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ์ œ ๋ธ”๋กœ๊ทธ ๊ธ€ <About App Luanching Sequence> ์—๋„ ์ ํ˜€์žˆ๋‹ต๋‹ˆ๋‹ค!โœŠ๐Ÿป

     

    ์•ฑ ๋Ÿฐ์น˜ ํƒ€์ž„์— ์ผ์–ด๋‚˜๋Š” ์ผ๋“ค


     

    ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด๋ณด์ž

     

    ์•„๋ฌดํŠผ ์šฐ๋ฆฌ๋Š” a main static function of type () -> Void or () throws -> Void ๋งŒ ์„ ์–ธํ•ด์ฃผ๋ฉด

     

    ๊ทธ ํƒ€์ž…์„ ํ”„๋กœ๊ทธ๋žจ์˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     ์ €๋Š” ๊ธฐ์กด์˜ AppDelegate ์˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ๋Œ€์‹ ,

    ์ƒˆ๋กœ์šด ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋กœ ์‚ฌ์šฉํ•  ์ž„์˜์˜ Starter ํƒ€์ž…์„ ์ง€์ •ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

     

     

    ์ด ์•ฑ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ ๊นŒ์š”?

     

    ์ด์ œ AppDelegate์˜ main() ์€ ๋” ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

     

    ๊ทธ ๋Œ€์‹  Starter ์˜ main() ์ด ์•ฑ ์‹คํ–‰ ์ตœ์ดˆ์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

     

    ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฉ”์„œ๋“œ๋Š” "Hi" ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    ์‹ค์ œ๋กœ ์•ฑ์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด, ์ฝ˜์†”์— Hi ๋งŒ ์ถœ๋ ฅ๋˜๊ณ  ์•ฑ์€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

     

    ๊ธฐ์กด์˜ AppDelegate ์˜  main ์ด ์ˆ˜ํ–‰ํ–ˆ๋˜ UIApplicaion ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ, runLoop ๋Œ๋ฆฌ๊ธฐ ๋“ฑ์˜ ์ผ๋ จ์˜ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ์ด๋Ÿฐ ์ž‘์—…์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฌธ์„œ์—์„œ๋Š” 'boot-loading' code ๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (OS ์—์„œ ๋ดค๋Š”๋ฐ)

     

    ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์•ฑ ํ”„๋กœ์ ํŠธ์—์„œ ์ปค์Šคํ…€ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ค์šด ์ž‘์—…์ผ ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค.

     

    ํ•˜์ง€๋งŒ ์œ„ ๊ธ€์€ @main ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ์—๋Š” ์ข‹์€ ์˜ˆ์‹œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

     

     

     

    ์˜ค๋Š˜๋„ ๋‚˜๋Š” ์„ฑ์žฅํ–ˆ๋‹ค!!!!!!โœŠ๐Ÿป


     

     

    ์ฐธ๊ณ ์ž๋ฃŒ

    github.com/apple/swift-evolution/blob/master/proposals/0281-main-attribute.md

    https://developer.apple.com/swift/blog/?id=7 

     

    ๋Œ“๊ธ€

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ๋‚˜