iOS/🟠 Swift

[Swift] @main κ³Ό μ»€μŠ€ν…€ μ—”νŠΈλ¦¬ 포인트

woozzang 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