본문 바로가기

유치원 활동∙̑◡∙̑

SWIFT 초보 ( 앱의 기본 구조 )

반응형

SWIFT는 우리나라에서 제 3 외국어와 같은 그런 너낌쓰..

다들 많이 다루지 않다보니 확실히 안드로이드 보다 인터넷 강의나 교재들의 수가 많지 않고

유튜브나 구글링을 하면 모든 정보가 나오지만 영어라서 쉽게 이해하기가 어렵다.유튜브에서 IOS Academy라는 좋은 채널을 알게 되었는데 한글 자막이 없어 이해하는데에 불편했다.실제로 함께 따라하며 배우는 부분이라 화면 그대로 나도 같이 구현 해 보면 되지만

혼자 하다가 막혔을 때 음...급 우울해진다.

이것은 다 내가 기본기가 없기 때문이겠지..구체적으로 설명해주는 책이 있을까싶어 찾아봤다.

'재은씨의 꼼꼼한 SWIFT'

과연 이 책은 내 수준에 맞추고 있을까 의심반 기대반으로 도서관에서 대출했다.생각보다 책이 너무 두꺼워서 놀랐고

그래서 기대로 꽉찼다!

책에서 알려준 것들을 토대로 내 나름 정리하고 포스팅 해 본다.

 

앱의 기본 구조

C언어의 뿌리를 둔 모든 애플리케이션은 main()함수로부터 시작된다. 

이것을 엔트리 포인트라고 한다.Entry Point,시작 진입점.

운영체제가(내 경우엔 OS) 해당 앱의 main()함수를 호출하면,이 main()함수에 작성된 코드들이 실행되면서

내가 작성한 코드까지 도달하는 그런식이다.ios도 마찬가지인데 대신 XCode는 프로젝트를 생성하면 main()함수가 자동으로 만들어지기 때문에 ios개발자는 main()함수를 건드릴 필요가 없다.올?

 

 

main() 함수

main()함수가 실행되면 시스템으로부터 전달 받은 2개의 인자값과 [인자값 : 함수에 전달되는 데이터 ]

AppDeelegate클래스를 이용해서 UIApplicationMain()함수를 호출하고,그 결과로 UIApplivation객체를 반환한다.

생성된 UIApplication객체는 UIKit 프레임워크에 속해 있기 때문에, 그 이후에는  앱을 제어할 수 있는 권한이 UIKit프레임워크로 간다.

 

UIApplicationMain()함수

main()함수가 C언어 기반의 앱 엔트리 포인트라면,UIApplicationMain()함수는 ios부분의 엔트리 포인트라고 할 수 있다.

이 함수는 앱의 핵심객체를 만드는 프로세스를 핸들링하고,스토리보드로부터 앱의 ui를 읽어들인다.

그리고 내가 작성한 코드를 호출 해 줌으로써 앱 생성초기에 필요한 설정을 구현할 수 있도록 해 준다.

여기에 이벤트 루프를 실행시키기도 하고.

이 과정에서 개발자가 하는 것은 스토리보드 파일이나 초기화를 위한 커스텀 코드 뿐이다.

 

 

UIApplication

UIApplicationMain()함수가 생성하는 UIApplication은 앱의 본체라고 할 수 있는 객체로 사실상 그 앱 자체를 의미하는데 

우리가 작성한 코드나 객체들,우리가 앱의 기능이라고 생각하는 것들은 다 UIApplication에 포함되어있는 하위 객체들이다.

스마트폰에 설치된 앱을 실행하면 초기 구동과정을 거쳐서 앱 프로세스가 메모리에 등록되며 이 때의 앱 프로세스가 곧 UIApplication 객체라고 해도 무방하다.

 

UIApplication객체는 이런 일을 한다.

1. 이벤트 루프 관리

2. 높은 수준의 앱동작을 관리

3. 푸시알림 등의 특수한 이벤트를 델리게이트에게 알려주기

등등등

 

AppDelegate는 UIApplication으로부터 위임받은 일부 권한을 이용 해 내가 작성한 코드와 상호작용하는 역할을 담당하고,이를 통해 우리가 필요한 코드를 구현할 수 있도록 도와준다.쉽게 말해 UIApplication 객체는,앱이 해야할 아주 중요하고 핵심적인 일을 하고 AppDelegate는 코드를 처리하는 그런 정도.

AppDelegate는 코드와 연결되는 만큼 대부분 커스터마이징하거나 서브클래싱해서 사용할 수 있도록 오픈되어 있다

프로젝트를 생성하면 XCode왼쪽 네비게이션안에 만들어진 파일들 중 AppDelegate가 있는데 이 AppDelegate 안에서 손쉽게 코드를 수정할 수 있다.

 

앱이 실행되는 전체 과정 정리

1. main()함수가 실행된다.

2. main()함수는 UIApplicationMain()함수를 호출한다

3.UIApplicatioinMain() 함수는 앱의 본체에 해당하는 UIApplication 객체를 생성한다

4. UIApplicatioin객체는 info.plist 파일을 바탕으로 앱에 필요한 데이터와 객체를 가져온다

5. AppDelegate객체를 생성하고 UIApplication 객체와 연결한다

6. 이벤트 루프를 만드는 등 실행에 필요한 준비를 진행한다.

7.실행 완료 직전,AppDelegate의 application(_:didFinishLaunchWithOptions:) 메소드를 호출한다

 

 

 

그런데!!!

스위프트는 C언어 기반의 언어가 아니라서 스위프트 기반 프로젝트에서는 main.m파일이 존재하지 않으며 엔트리 포인트 역시 존재하지 않는다.이 때문에 스위프트에서는 위의 1~5번의 과정을 @UIApplicationMain 의 어노테이션 표기로 대체한다.

스위프트에서 직접 UIApplicationMain()을 호출하여 델리게이트 클래스를 인자값으로 전달 할 수 없으므로 대신 앱 델리게이트 역할을 할 클래스에 @UIApplicationMain 어노테이션을 걸어 표시하는 방법으로 시스템에 델리게이트 클래스 정보를 전달할 수 있다

ios시스템은 앱을 실행할 때 이 어노테이션이 표시된 클래스를 찾아 델리게이트로 지정하게 된다 그 이후로 진행되는 과정은 앞에서 설명한 것과 동일.