티스토리 뷰

 

@main에 대해 작성하게 된 이유는 AppDelegate와 SceneDelegate의 역할과 기능을 공부하면서 궁금한 것들이 많이 생겨서 입니당

2021.09.29 - [SSAC - iOS] - [SSAC - iOS] 09월 28일 TIL

 

[SSAC - iOS] 09월 28일 TIL

1. 앱의 구조와 동작 원리 화면 기능 데이터 데이터가 앱 내부에 저장이 되어 있을 경우 : 백업/복구 필수 (ex. 혼자 사용하는 투두, 일기, 영화 관리 앱 등) 데이터가 서버에 저장이 되어 있을 경우

seungchan.tistory.com

기존에 간단하게 포스트했었는데 다시 한 번 정리해보겠습니다.

(다음 글에서는 AppDelegate와 SceneDelegate에 대해 작성해보겠습니다.)

프로젝트를 생성하면 기본적으로 생성되어 있는 것들이 있습니다.

그 중 AppDelegate에 들어가보면 @main이라고 적혀 있는 것을 보실 수 있습니다.

 

@main이 뭔가요?

Swift 프로젝트에서는 Entrty Point 역할을 하는 main 함수가 보이지 않습니다! (UIKit 프레임워크에 숨어 있어서..)

Swift 컴파일러가 @main 어노테이션을 통해 AppDelegate에서 전역범위에 있는 코드를 자동으로 인식하게 하고 실행시켜 Entry Point가 지정되게 하기 때문인데요!

간단한 예시를 들자면 FirebaseMessaging 설정을 AppDelegate에서 해주니까 background, foreground에서 자유롭게 푸시알림이 온다는 것?!

따라서 AppDelegate에 있는 @main을 지우고 빌드를 하게 된다면 빌드 에러가 발생합니다.

Xcode 12 이전 버전에서는 @UIApplicationMain으로 되어 있었고 Xcode 12 부터 @main으로 바뀌었다고 합니다.

 

@main을 알아보기에 앞서 @UIApplicationMain은 어떤 역할과 기능을 했는 지 알아보겠습니다.

@UIApplicationMain

  • 앱의 본체에 해당하는 객체인 UIApplicaion객체를 생성하고 앱의 Life Cycle 을 관리한다.
  • 지정된 클래스 (@UIApllicationMain이 표시된) 에서 델리게이트를 인스턴스화하고, 이를 앱의 객체에 할당한다.
  • @UIApplicationMain 어노테이션은 UIApplicationMain 함수를 호출하는데, 이 함수는 App의 핵심 객체 구현과 App 구동 플로우에서 중요한 역할을 수행한다.
그럼 왜 @main을 사용하게 되었을까요?

@main

@main은 프로그램 실행 시작 시 진입점으로 타입을 지정하기 위한 Swift 언어의 기능이다. 사용자는 탑 레벨의 코드를 작성하는 대신 @main단일 유형의 속성을 사용할 수 있고, 라이브러리와 프레임워크는 프로토콜이나 클래스 상속을 통해 맞춤형 진입점 동작을 제공할 수 있다. 

https://github.com/apple/swift-evolution/blob/main/proposals/0281-main-attribute.md 에서 그렇다고 하네요..

 

 

탑 레벨 코드

Swift 소스 파일 안에서 탑 레벨 코드는 0개 이상의 선언이나 정의 그리고 표현식으로 구성이 됩니다.

기본적으로 소스파일의 탑 레벨에서 선언된 것들은 같은 모듈 내의 모든 소스파일에서 접근이 가능하다.

 

탑 레벨 코드에는 선언문과 실행 구문 두 가지가 있습니다.

선언문 (top-level declarations)

  • 모든 Swift Source File에서 사용이 가능하다.
  • 변수, 함수 등의 선언문은 전역으로 얼마든지 선언이 가능하며 같은 모듈 내에서 자유롭게 접근 가능하다.

 

실행문 (excutable top-level code)

  • 선언을 제외한 모든 구문을 의미한다.
  • 실행문은 Top-Level Entry Point에서만 사용이 가능하다.

https://docs.swift.org/swift-book/ReferenceManual/Declarations.html

 

Declarations — The Swift Programming Language (Swift 5.6)

Declarations A declaration introduces a new name or construct into your program. For example, you use declarations to introduce functions and methods, to introduce variables and constants, and to define enumeration, structure, class, and protocol types. Yo

docs.swift.org

@main 이전에 사용하던 @UIApplicationMain의 속성이라는 것을 알 수 있습니다.

 

그럼 왜 @UIApplicationMain 대신 @main을 사용하게 된 것인가?

1. 초기 Swift에서 앱 실행은 UIApplication모든 단일 iOS 앱에 대해 동일한 프로세스인 인스턴스를 실행하고 유지 관리하는 데 의존했습니다.  부팅의 이 초기 프로세스는 UIApplicationUIKit에 의해 추상화되며, 특히 이것이 앱이 가장 먼저 해야 할 일이라는 점을 고려하면 사용자가 이에 대해 걱정할 이유가 없었다. 하지만 이러한 이유로 사용자에 대한 이러한 책임을 처리하는 것이 부정적인 결과를 초래할 수 있다고 합니다.

 

2. 이 문제가 발생하지 않도록 Apple은 UIKit이 iOS 앱을 부팅하는 데 필요한 코드를 제공하는 책임이 있다면 Swift 자체에서 해결을 해야 한다고 생각을 했고 Swift 컴파일러는 두 가지 새로운 특수 속성인  @UIApplicationMain 및 @NSApplicationMain을 지원하기 시작했습니다.

 

3. UIKit이 진입점 제어의 이점을 얻은 유일한 프레임워크가 아니었다고 합니다. 

Swift CLI 도구를 위한 많은 프레임워크는 일종의 초기 설정을 포함하므로 언어가 현재 하드코딩된 것을 복제하는 표준 방법을 제공하는 것이 @UIApplicationMain입니다.

 

4. 마지막으로 Swift 5.3 @main에서는 개발자가 이 동작을 제어할 수 있도록 속성이 추가되었습니다.

 

정리

1. 구조체에서 @main 대신 @UIApplicationMain를 쓴다면 class 선언에만 사용이 가능하다는 오류가 발생!

2. @UIApplicationMain 대신 @main을 사용함으로 타입 기반의 스위프트 코드에서 이상적인 진입점을 알려주며 main() 함수는 일반 정적 메서드이므로 프로토콜에서 확장 메서드 또는 기본 클래스로 제공 할 수 있다. -> 자유롭게 Entry Point 지정 가능!

3. 클래스나 구조체에 @main이 명시된 경우라면 static func main() 메서드가 실제 진입점이 된다! -> 자유롭게 Entry Point 지정 가능!

4. @main, @UIApplicationMain, 및 @NSApplicationMain는 컴파일러가 애플리케이션의 진입점을 합성하고 "main.swift" 파일이 필요 없도록 하는 속성!

 

참고 블로그

https://barosalki.tistory.com/entry/iOS-Swift-53-main-type%EA%B8%B0%EB%B0%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%A7%84%EC%9E%85%EC%A0%90

 

[iOS & Swift 5.3+] @main : type기반의 프로그램 진입점

iOS 프로젝트를 처음 생성하면 자동으로 생성되는 몇 가지 파일이 있죠? 그 중에서 "AppDelegate.swift"는 AppDegate 클래스를 정의하고 앱이 시작되는 진입점을 알려주고 앱의 입력이벤트를 전달하는

barosalki.tistory.com

https://swiftrocks.com/entry-points-swift-uiapplicationmain-main

 

Entry Points in Swift: How @main and @UIApplicationMain work internally

In this article, we'll see how Swift determines the entry point of an app, the different attributes used to alter this behavior in iOS, how they work internally, and what Swift 5.3's new @main attribute brings to the table.

swiftrocks.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함