본문 바로가기

Programming/iOS : Swift

[swift] 2. iOS앱의 기본 구조 및 생명 주기


  개요


기존 다른 프로그래밍 언어를 배우신 분이면 main()함수는 알고 계실 것입니다. main()함수는 엔트리 포인트(시작 진입점)라고 하죠. 프로그램을 시작하면 운영체제가 main()함수를 찾아 호출하면 여기서부터 프로세스가 시작하게 됩니다. 하지만 스위프트는 C 기반 언어가 아닙니다. 따라서 스위프트 기반 프로젝트에는 main 파일이 존재하지 않으며 엔트리 포인트 역시 존재하지 않습니다. 하지만 시작 진입점이 없으면 안되기 때문에 스위프트에서는 어노테이션 표기로 대체합니다. 아래 코드 중 형광팬으로 표시되어 있는 부분이 어노테이션 표기부분입니다. 


import UIKit


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        // Override point for customization after application launch.

        return true

    }


위의 코드는 AppDelegate 클래스의 코드인데, AppDelegate는 UIApplication의 권한은 위임받아 일부 기능을 구현합니다. 여기까지 읽었을 때 UIApplication이 무엇인지 AppDelegate가 무엇인지 모르실 텐데 하나하나씩 살펴보도록 하겠습니다. 


  UIApplication , AppDelegate


*해당 내용은 '꼼꼼한 재은 씨의 스위프트 3 프로그래밍' 서적 토대로 작성하였습니다.


단순히 정보만 주는 '음식 레시피' 앱을 예로 들어보겠습니다. '음식 레시피' 개발에 있어, 개발자 입장에서 보면 단순히 페이지 몇개를 만들어 음식별로 레시피를 적어 놓기만 하면 될 것 같습니다. 하지만 App의 내부를 자세히 살펴보면, 앱을 처음 시작하였을 때 무엇을 설정하고, 메모리에 무엇을 로드하고, 사용자가 클릭이나 스크롤등을 하였을 때 어떻게 동작하여야 되는지, 앱이 종료될 때 무엇을 어디에 저장해야될 지 등을 저희는 구현하지 않았습니다. 이러한 앱의 핵심 객체를 생성하는 프로세스를 핸들링하고, 스토리보드 파일로부터 앱의 유저 인터페이스를 읽어들일뿐만 아니라 우리가 작성한 커스텀 코드를 호출해 주는 함수가 UIApplicationMain()입니다. 이 함수는 UIApplication 객체를 반환하는데 UIApplication은 앱의 본체라고 할 수 있는 객체입니다. 우리가 작성한 커스텀 코드나 객체들, 그리고 우리가 앱의 기능이라고 생각하는 모든 것들은 다 UIApplication에 포함되어 있는 하위 객체입니다. 우리는 이 클래스를 서브 클래싱 없이 그대로 사용하는데, 굳이 할 필요도 없고 하기도 어렵기 때문입니다. 그런데 그대로 사용하는 것에는 한계가 있습니다. 우리가 원하는 방향이나 목적에 맞게 특별히 처리해야 할 수도 있기 때문입니다. 그래서 UIApplication 객체는 AppDelegate라는 대리 객체를 내세우고 커스텀 코드를 처리할 수 있도록 권한을 부여합니다. 


즉, UIApplication 객체는 앱이 해야 할 중요하고 핵심적인 일, 앱의 생명주기 관리나 이벤트 처리와 같은 것들을 담당하고, AppDelegate커스텀 코드를 처리합니다.



  앱의 생명 주기


iOS생명주기


왼쪽은 iOS 시스템 프레임워크이고, 오른쪽은 우리가 작성한 커스텀 코드입니다. 그림과 다르게 스위프트에서는 main()함수를 통해 UIApplicationMain()을 호출하는 대신 @UIApplication 어노테이션을 찾아 해당하는 클래스를 실행합니다. 이 때 AppDelegate 클래스에 작성된 application(_:didFinishLaunchingWithOptions:)메소드가 시스템에 의해 자동으로 호출됩니다. 이 함수 안에 원하는 커스텀 코드를 작성해 두면 앱이 처음 실행될 때 원하는 기능을 수행할 수 있습니다.

다음으로 시스템 프레임워크의 이벤트 루프가 실행되면서 우리가 작성하는 이벤트 핸들에 의해 커스텀 코드로 연결됩니다. 시스템에서 발생할 수 있는 여러 이벤트 중에서 우리가 원하는 이벤트를 제어하도록 핸들을 만들어 커스텀 코드와 연결해 놓으면 이벤트 루프에서는 특정 이벤트가 발생했을 때 우리가 만든 핸들을 통하여 커스텀 코드를 실행할 수 있도록 처리합니다. 

앱이 종료하기 전에는 시스템이 앱을 메모리에서 제거하기 위한 준비를 합니다. 이 때에는 applicationWillTerminate(_:)메소드를 호출합니다. 앱 종료 하기 전에 처리해야 할 부분이 있으면 이 함수 안에 작성하면 됩니다.


이처럼 앱이 시작할 때, 종료할 때 등 특정시점마다 시스템이 알아서 호출해주는 메소드가 있으므로 해당 메소드에 원하는 코드를 작성하면 우리가 원하는 기능을 수행할 수 있습니다. 

'Programming > iOS : Swift' 카테고리의 다른 글

[swift] 1.기본 문법 : 옵셔널(Optional)  (0) 2017.01.24