Developing Myself Everyday
article thumbnail

 

 

게시글을 시작하기에 앞서 안드로이드가 말하는 Context의 정의에 대해 알아보겠습니다.

 

Context의 정의
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의 정의를 세세히 짚어보겠습니다.


 

 

 

"Abstract 클래스이며 실제 구현은 안드로이드 시스템에 의해 제공된다."


혹시 팩토리 메서드 패턴에 대해 들어보셨나요?


팩토리 메서드 패턴은 객체 생성의 책임을 서브클래스로 위임하여, 객체 생성 과정을 분리하는 디자인 패턴입니다.

안드로이드의 Context도 이 패턴의 원리에 따라 동작합니다.


즉, Context는 단순한 객체가 아니라, 직접 인스턴스화할 수 없으며, Android 시스템이 적절한 서브클래스를 생성해 제공하는 구조입니다.

 

예를 들어, Activity, Service, Application 등은 모두 Context를 상속받은 클래스들입니다. 이러한 클래스들은 각자의 역할에 맞게 Context 기능을 구현하며, 개발자가 직접 new를 통해 생성할 수 없습니다. 대신, Android 시스템이 이 객체들을 생성해주며, 우리는 Intent 등을 통해 생성 요청만 할 수 있습니다.

val intent = Intent(context, NextActivity::class.java)
context.startActivity(intent)

 

즉, Activity나 Service를 직접 만드는 것이 아니라, Android 시스템이 적절한 시점에 해당 객체를 생성하고, 필요한 Context를 함께 제공하는 구조입니다.

 

이러한 구조 덕분에 애플리케이션과 운영 체제 간의 결합도를 낮추고, 유지보수를 용이하게 하며, 일관된 객체 생성을 보장할 수 있습니다.

 

 

 

 

리소스와 Context


또한 Context는 팩토리 메서드 패턴을 기반으로 동작하는 전역 환경 제공자(Global Environment Provider) 역할을 한다고 볼 수 있습니다.

 


예를 들어, 다음과 같은 정보가 있습니다.

  • 현재 기기의 테마(라이트/다크 모드)
  • 화면 방향(세로/가로)
  • 글로벌 설정(사용자가 설정한 시스템 글꼴 크기 등)

 

안드로이드의 리소스(res)에 접근하려면 context를 통해야 하는데, 이는 바로 Context가 제공하는 전역 정보를 바탕으로 적절한 값을 반환하기 위함입니다.

val myString = context.getString(R.string.app_name)
val myColor = context.getColor(R.color.primary)

 

이를 통해 다양한 언어를 정의할 수 있고, 이미지 리소스의 경우에는 픽셀 필도에 따라 다른 이미지를 제공할 수도 있습니다. OS는 context를 통해 자동으로 적절한 값들을 선택해 반환해줍니다.

 

 

 

 

애플리케이션과 프로세스


Android가 이런 방식으로 Context를 사용하게된 상황은 아래의 내용 때문입니다.

 

컴퓨터 프로그램의 실행

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

 

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

 

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

 

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

 

 

 

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

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

 

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

 

 

 

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

 

 

 

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

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

 

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

 

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

 

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


 

 

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

 

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

 

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

 

짜잔!!

 

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

 

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

 

 

 

애플리케이션과 Context


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

 

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

 

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

 

 

Using the Android Context and Manifest to unveil the Android System Internals (2025 Edition)

How the Context and Manifest connect your app with Android’s core system

proandroiddev.com

 

profile

Developing Myself Everyday

@배준형

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