Developing Myself Everyday
article thumbnail

Context란?


안드로이드에서 Context를 왜 사용하는지에 말하기 전에 일단 안드로이드가 말하는 Context의 정의에 대해 알아보겠습니다.

 

Class Overview
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
 
애플리케이션 환경에 관한 전역 정보를 제공하는 인터페이스. Abstract 클래스이며 실재 구현은 안드로이드 시스템에 의해 제공된다. Context 를 통해, 애플리케이션에 특화된 리소스나 클래스에 접근할 수 있을 뿐만 아니라, 추가적으로, 애플리케이션 레벨의 작업 - Activity 실행, Intent 브로드캐스팅, Intent 수신 등, 을 수행하기 위한 API 를 호출 할 수도 있다.

 

흔히 면접 같은 곳에서 Context에 대해 묻는다면 간단하게 안드로이드 애플리케이션의 실행 환경에 대한 전역 정보를 제공하는 클래스라고 할 것입니다.

 

저여!

 

그런데 만약 안드로이드가 왜 Context를 사용하냐고 묻는다면 답할 수 있는 사람은 많지 않을 것이라 생각합니다. 그래서 이제부터 왜 안드로이드가 Context를 사용하게 되었는지를 말해보고자 합니다. 

 

 

 

 

애플리케이션과 프로세스


컴퓨터 프로그램의 실행

프로그램(Program)은 흔히 소프트웨어라고 칭하는 애플리케이션들을 말합니다. 당장 저의 컴퓨터에 설치되어있는 카카오톡, 계산기, 안드로이드 스튜디오 같은 것들이 모두 프로그램입니다.

 

프로그램은 디스크에 저장되어 있는 레시피와 같습니다. 요리를 만들기 위해 해야할 작업을 적어논 지침서이지요.

 

프로그램만 있어서는 요리를 만들 수 없습니다. 그렇기에 운영체제는 메모리내에서 프로세스(Process)를 실행해 프로그램에 지침에 따라 작업을 수행합니다.

 

일반적인 데스크롭 프로그램의 경우, 하나의 프로그램이 하나의 프로세스 내에서 실행됩니다. 운영체제의 커널에서 프로세스를 관리할 때, 특정 프로세스는 하나의 프로그램과 연결되어 있기 때문에 쉽게 프로그램에 접근할 수 있습니다.

 

 

 

안드로이드 애플리케이션의 실행

안드로이드의 모바일 디바이스는 컴퓨터에 비해 많은 한계가 있습니다. 메모리의 총량이 작기에 프로세스가 매우 쉽게 종료됩니다. 

 

그리고 사용자들은 특정 애플리케이션을 종료하지 않고, 다양한 종류의 애플리케이션을 아주 짧고 반복적으로 사용합니다.

 

 

메모리의 총량은 작은데, 다양한 종류의 애플리케이션을 종료하지 않고 사용해야 하기에 안드로이드는 컴퓨터에서 하던대로 할 수 없었습니다. 그래서 조금 다른 방식을 사용하기로 했습니다.

 

 

 

안드로이드의 멀티태스킹(Multitasking)

안드로이드는 프로세스와 애플리케이션을 컴퓨터처럼 밀접하게 연결시키지 않았습니다.

 

애플리케이션은 해당 애플리케이션을 작동시키고 있는 프로세스가 없음에도 사용자에게 현재 작동하고 있는 것 처럼 보일 수도 있고, 실재로 애플리케이션이 작동 중이 아님에도, 애플리케이션을 구동했던 프로세스들은 종료되지 않고 안드로이드 시스템에 의해 유지될 수 있습니다. 

 

또, 여러 애플리케이션이 프로세스를 공유하거나하나의 애플리케이션이 여러개의 프로세스를 사용할 수도 있습니다.

 

디바이스의 메모리만 충분하다면 안드로이드는 프로세스를 완전 종료시키지 않고 백그라운드 상에서 프로세스를 유지시킵니다.


 

 

메모리만 충분하다면 고민할 필요도 없었겠지만, 안드로이드는 이전에 말했듯 메모리의 총량이 작습니다. 이러한 한계를 극복하기 위해 안드로이드 시스템은 더 이상 필요하지 않은 프로세스를 그냥 종료해버리기로 했습니다(!?!?)

 

 

사용자가 언제든 다시 해당 애플리케이션으로 돌아올 수 있는데, 그냥 종료시킨다면 분명 사용자는 자신이 작성한 문서가 어디갔냐고 화를 낼 것입니다.

 

 

 

그래서 안드로이드는 약간의 속임수(?)를 쓰기로 했습니다. 애플리케이션이 종료될 때 정보를 저장해놓고, 마지막 상황과 동일한 형태로 애플리케이션을 시작하는 겁니다.

 

짜잔!!

 

사용자에게 보여지는 애플리케이션 요소는 저장됩니다. Activity의 상태 정보는 Activity를 떠날 때마다 저장됩니다.

 

안드로이드에서의 애플리케이션 정보는 안드로이드의 시스템 서비스 중 하나인 ActivityManagerService에서 관리합니다. 

 

 

 

애플리케이션과 Context


뭔가 조금씩 명확해 집니다. 안드로이드는 애플리케이션과 프로세스를 느슨하게 관리하기에 프로세스로 애플리케이션에 바로 접근하기 어렵습니다.

 

이 때 사용되는 것이 Context입니다.

 

애플리케이션 정보는 ActivityManagerService 있습니다. 프로세스를 통해선 원하는 애플리케이션에 대한 정보를 얻을 수 없으니 각 애플리케이션을 구분할 수 있는 ID가 필요합니다. 이 역할을 Context가 합니다.

 

 

 

 

Context의 생성


Context 클래스는 추상 클래스로 되어있고, 애플리케이션(Application), 액티비티(Activity), 서비스(Service)는 이 Context 추상 클래스를 구현한 ContextImpl 클래스를 내부적으로 이용한 ContextWrapper를 상속받습니다.

 

각 컴포넌트는 서로 다른 Context 인스턴스를 사용하고 있습니다. 이 이유는 어떤 컴포넌트에서 시스템 API를 호출하느냐에 따라 다른 결과가 나타나야 하기 때문입니다.

 

 

 

 

마무리


안드로이드 Context 는 여러가지 이유로 기존 플랫폼과는 다른 방식으로 애플리케이션을 관리하고 있고, 때문에 기존 플랫폼들에서는 단순하게 시스템 API 를 통해 할 수 있는 일들을, Context 인스턴스라는 조금은 귀찮지만 강력한 녀석을 통해 대행 처리하고 있다고 할 수 있겠습니다.

 

 

 

 

 

Reference

 

안드로이드 Context 이야기

<안드로이드 Context 는 수수께기가 많은 클래스입니다>  Android Context Story  저...

blog.naver.com

 

프로그램과 프로세스의 차이점

"프로그램 종료"와 "프로세스 종료" 어떤 게 맞는 말일까요? 혹시 똑같은 의미이라고 생각되시나요? 어떤 말이든 의미는 통하지만 엄밀히 말하면 프로세스 종료가 정확한 표현입니다. 자주 헷갈

change-words.tistory.com

 

[번역] 안드로이드의 멀티태스킹 (Multitasking the Android Way)

[이 포스트는 Dianne Hackborn 에 의해 작성되었습니다. 그녀는 안드로이드의 개발에 매우 중요한 ...

blog.naver.com

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!