모바일 앱 화면 Life Cycle (2)
AOS와 iOS, Life Cycle 비교
이 글은 두 편으로 나뉜 시리즈 글로, 1) Android OS(이하 AOS)와 iOS의 화면 Life Cycle에 대하여 각각 알아보고, 2) 두 운영체제의 화면 Life Cycle을 비교함으로써, 모바일 앱 화면의 Life Cycle에 대한 이해를 돕고자 한다.
모바일 앱 화면의 Life Cycle을 이해하기 위해 살펴볼 운영체제로서 AOS와 iOS를 선정한 것은, 두 운영체제가 모바일 운영체제 시장의 99%를 차지할 만큼 지배적이며 대표적인 운영체제이기 때문이다. 물론, 두 운영체제가 유명한 만큼, 각각의 Life Cycle에 대해 설명한 글은 흔히 찾아볼 수 있다.
그러나 우리는 두 운영체제를 동일한 선상에 두고 최대한 1:1로 대응시켜 비교함으로써, 두 운영체제의 차이점과 공통점을 찾는 것에 집중하고 개별 OS가 아닌 ‘모바일 앱의 화면 Life Cycle’에 대한 이해를 돕고자 한다.
두 운영체제를 비교하고자 하거나, 모바일 앱의 화면에 대하여 알아보고자 하는 독자들에게 이 글이 도움이 되기를 바란다.
그럼 시리즈의 두번째 순서로, 두 운영체제의 비교에 들어가보자.
Life Cycle Comparison
앞서 살펴본 두 OS의 Life Cycle의 비교를 위해, 전체 Life Cycle을 아래와 같이 5가지 상태로 분류하여 정리하였다.
- Birth: 화면의 생성 및 데이터 초기화
- Prepare to Run: 화면 실행을 위한 준비
- Run: 사용자에게 화면이 표시된 상태
- Prepare to Death: 화면을 종료할 준비
- Death: 화면의 종료
Birth
Birth는 화면을 생성하고 초기값을 설정하는 상태이다.
AOS
onCreate()는 화면 구성 및 데이터 초기화 등 화면 생성에 필요한 모든 일을 수행한다.
iOS
init(…)은 화면을 관리할 viewController를 생성하고, 화면에 필요한 파라미터를 전달받는 역할을 한다. loadView()는 viewController와 연결된 .xib파일 등을 읽고 화면을 구성한다. viewDidLoad()는 주로, 화면이 생성되었을 때 필요한 초기 데이터를 적용하는 용도로 구현된다.
차이점
iOS는 3개의 함수로 나뉘어 수행되고, AOS는 onCreate()이 모든 역할을 수행한다. 코드의 역할을 나누어 처리하는 점에서 iOS의 구조가 비교적 깔끔하게 여겨질 수 있으나, iOS 역시 코드의 구현이 viewDidLoad()에 집중되므로, 주목할 만큼 큰 차이는 보이지 않는다.
Prepare to Run
Prepare to Run 상태는 아직 사용자가 화면을 사용할 수 없으며, 실행을 위한 준비를 하는 단계이다.
AOS
onStart()는 화면의 실행을 준비하는 첫 단계로, 서버에 데이터를 요청하거나 각종 리스너를 등록하는 등 화면의 실행에 필요한 정보 등을 미리 준비한다. onResume()은 사용자와 상호작용하기 직전의 상태이기 때문에, 필요한 애니메이션 실행 등의 화면 갱신 처리를 한다. onRestart()는 화면이 숨김 상태에서 다시 사용자에게 표시될 때에만 수행되어야 할 내용이 있는 경우에 사용하며, 보통 잘 사용하지 않는다.
iOS
viewWillAppear()는 화면이 표시되기 전에 호출되므로, 사용자에게 적절한 appearance를 제공하기 위한 준비를 수행한다. viewDidAppear()는 화면이 표시된 이후에 호출되므로, appearance 보다는 사용자가 당장 사용하지는 않을 데이터 등을 미리 준비하는 작업에 적합하다.
차이점
Prepare to Run 단계에서 가장 중요한 역할은 적절한 데이터를 화면을 표현하여 사용자와 상호작용을 할 수 있도록 준비하는 것이다.
AOS의 경우, 데이터를 화면에 표현하는 시점인 onResume()의 이전 단계에 배치된 onRestart()와 onStart()를 이용하여 화면에 표현할 데이터의 처리를 섬세하게 나누어 준비할 수 있다는 장점이 있다.
iOS는 이와 반대로, 데이터를 화면에 표현하는 시점인 viewWillAppear()의 이후에 배치된 viewDidAppear()를 이용하여 화면에 표현할 데이터와 그렇지 않은 데이터를 분리하여 준비할 수 있다는 장점이 있다.
Run
Run 상태는 사용자에게 화면이 표시되고, 사용자와 상호작용하며 코드를 실행하는 단계이다. AOS와 iOS와 모두, call-back 함수가 정의되어 있지는 않으며, 개발자의 의도대로 코드가 수행된다.
Prepare to Death
Prepare to Death 상태는 표시된 화면을 숨기고, 현재의 상태를 저장해두거나 사용하던 자원을 반환하는 등, 화면을 종료할 준비를 하는 단계이다.
AOS
onPause()는 사용자가 더 이상 상호작용할 수 없도록 화면을 비활성화할 때 호출되는데, 애니메이션 등 화면 갱신에 대한 처리 정지 또는 일시 정지할 때 필요 없는 리소스를 해제하거나 필요한 데이터를 영속화할 때 사용한다. onStop()은 사용자에게 더 이상 Activity가 보이지 않을 때 호출되므로, 주로 화면에서 사용 중이던 서버 연결이나 등록했던 리시버 등을 정리한다.
iOS
viewWillDisappear()는 화면이 숨겨지기 전에 호출되기 때문에, 현재 수행 중인 상호작용을 마무리하는 것에 집중하여 처리한다. viewDidDisappear()는 화면이 숨겨진 이후에 호출되기 때문에, 메모리의 해제 등 사용자와 직접적으로 관련되지 않은 정리 작업을 미리 수행하는 데 적합하다.
차이점
화면의 종료를 준비하는 Prepare to Death 상태에서는 AOS와 iOS가 큰 차이를 보이지 않는다.
Death
Death 상태는 화면을 종료하고, 화면이 쥐고 있던 메모리나 자원 등을 풀어주는 단계이다.
AOS & iOS
AOS의 onDestroy()와 iOS의 deint()은 override 되는 빈도가 적은 편이다. 사용한 리소스의 해제 등 종료에 필요한 정리는 앞선 Prepare to Death 상태에서 완료하기 때문에, 화면이 실제로 de-allocation 되는 시점이 특별히 중요한 경우를 제외하고는 크게 사용되지 않는다.
화면 전환
앞서 살펴본 Life Cycle의 이해를 돕기 위하여, 화면 A에서 화면 B로 전환되는 경우에 각각의 함수들이 어떤 순서로 호출되는지를 정리하였다.
AOS, Activity 간의 전환
사용자가 Activity A에서 Activity B로 이동하는 이벤트를 발생시키면, 가장 먼저 Activity A의 onPause()가 호출되어 Activity A를 숨기기 위한 준비를 한다.
이후 Activity B가 생성되며 onCreate()가 호출되고, 곧바로 onStart(), onResume()이 호출되고 사용자는 Activity B의 화면으로 이동하게 된다.
사용자가 Activity B로 이동한 직후, 사용자가 보지 않는 곳에서 Activity A의 onStop()이 호출되어 Activity A를 마무리하는 것으로 이동이 완료된다.
iOS, ViewController 간의 전환
사용자가 ViewController A에서 ViewController B로 이동하는 이벤트를 발생시키면, 먼저 ViewController B의 init(), loadView(), viewDidLoad()가 순차적으로 호출되며 ViewController B를 생성한다.
ViewController B가 생성된 후, ViewController A는 viewWillDisappear()를 호출하여 화면을 숨기기 위한 준비를 한다.
ViewController A가 화면을 숨길 준비가 완료되면, ViewController B는 viewWillAppear()를 호출하여 사용자를 ViewController B의 화면으로 이동시킨다.
사용자가 ViewController B로 이동한 후, ViewController A는 ViewDidDisappear()를 호출하여 화면 숨김을 마무리하고, ViewController B는 viewDidAppear()를 호출하여 화면 표시를 마무리한다.
이로써 두 편에 걸쳐 AOS와 iOS의 화면 Life Cycle에 대하여 알아보았다.
스마트폰 운영체제 시장을 양분하고 있는 AOS와 iOS는 많은 차이점들을 가지고 있다. 단언하기는 어렵지만, 오픈소스에 기반한 AOS는 대체로 개방적인 성격을 보이며, 애플의 독점 플랫폼인 iOS는 비교적 폐쇄적인 경향이 있다.
이처럼 다른 두 운영체제이기에, 이 글을 기획하며 많은 차이점을 찾아낼 수 있을 것이라고 생각했다. 그런데 도리어, 두 운영체제의 화면 Life Cycle이 매우 비슷한 구조를 보이고 있음을 확인할 수 있었다. 글을 작성하면서 기대한 만큼의 차이점을 찾지 못하여 아쉬운 마음도 있지만, 그만큼 ‘사용자와 상호작용하는 현재의 방법이 안정적으로 자리를 잡았다고 받아들여도 되지 않을까’하는 개인적인 의견으로 글을 마친다.
글 작성에 참고한 자료
정재곤, Do it! 안드로이드 앱 프로그래밍, 이지스퍼블리싱(2020)
안드로이드 액티비티(Activity) 생명주기 총정리, programmingfbf7290, https://programmingfbf7290.tistory.com/entry/안드로이드-액티비티Activity-생명주기-총정리
Android: Service란 무엇인가 그리고 생명주기는?, 내가 보려고 만든 블로그, https://ndpaulkim.tistory.com/92
Android Developers Documentation, https://developer.android.com/docs
Apple Developer Documentation, https://developer.apple.com/document