@main
Swift에서 @main이 뭘까?
모든 프로그램에는 항상 앱이 시작되어야 하는 진입점이 있으며 Swift도 예외는 아니다. 마치 c언어의 main함수 같이 말이다. 예전에는 아래와 같이 main.m 파일이 그 진입점 역할이었다.
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
위 코드는 더 이상 사용하지 않는 오래된 코드이며, 앱의 진입점을 알려주는 objective-c 코드이다.
아래 코드와 같이 Swift에서는 여전히 main.swift를 사용할 수 있으며 앱의 진입점이 된다.
autoreleasepool {
UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))
}
오늘날 우리는 @UIApplicationMain와 @main 2가지 방법으로 진입점을 나타낼 수 있다.
@UIApplicationMain
먼저 @UIApplicationMain 어노테이션이다. 이 어노테이션은 UIApplicationMain 함수를 호출하고 해당 클래스의 이름을 델리게이트 클래스의 이름으로 전달한다.
UIApplicationMain의 역할은 4가지 정도가 있다.
- 먼저 앱의 본체에 해당하는 객체인 UIApplication객체를 생성한다. 이 객체는 앱의 Life Cycle을 관리한다.
- @UIApplicationMain이 표시된 클래스에서 델리게이트를 인스턴스화 하고 이를 앱의 객체에 할당한다.
- 앱의 Run Loop을 포함한 기본 이벤트처리 루프를 설정하고 이벤트 처리를 시작한다.
- 앱의 info.plist에 불러올 main nib파일이 제대로 명시되어있으면, 해당 nib파일을 불러온다.
하지만 Xcode 12부터 @UIApplicationMain 대신 @main 속성이 쓰이게 된다.
@main
@UIApplicationMain과 같이 진입점과 관련된 어노테이션이지만 범용성이 더 넓다. 단일 파일 코드이던 프레임워크 프로젝트이던 커스텀 라이브러리던 상관없이 동일하게 진입점을 설정해줄 수 있기 때문이다. (다만, 커스텀 진입점을 설정하면 위에서 언급한 @UIApplicationMain의 4가지 역할은 하지 않는 것 같다.)
@main을 따로 설정해주지 않는다면 기본값으로 AppDelegate클래스가 호출되지만 만약 직접 지정해주고 싶다면 해당 함수는 아래 예시 코드와 같이 static이어야 한다.
@main
class Main{
static func main(){
print("Hello")
}
}
참고자료