[Swift] @main ๊ณผ ์ปค์คํ ์ํธ๋ฆฌ ํฌ์ธํธ
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 ์ ์ ์ด์ฃผ๋ ๊ฒ๋ง์ผ๋ก ์ํธ๋ฆฌ ํฌ์ธํธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์๊ตฌ์ฌํญ์ ์กฐ๊ธ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ํธ๋ฆฌ ํฌ์ธํธ๋ ํ๋ก๊ทธ๋จ์ ์์ ์ง์ ์ ์๋ฏธํฉ๋๋ค.
์ด ๊ฐ๋ ์ ๋จ์ผ ํ์ผ ๊ธฐ๋ฐ์ ์ ์ฐจ์ ์ฝ๋ ๋ฅผ ์์ฑ ํ ๋๋ ์์ง ๋ชปํด๋ ํฐ ์๊ด์ด ์์์ต๋๋ค.
๋จ์ผ ํ์ผ ๊ธฐ๋ฐ์์๋ ์์์๋ถํฐ ์๋๋ก ์ฐจ๋ก๋๋ก ์คํ๋๋๊น์!
" 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