안드로이드 개발을 하면서 우리는 항상 Context를 사용한다. 그렇다면 이렇게 자주 사용하는 Context는 대체 뭘까? 한 번 알아보자.
우선 Context에 대한 설명을 찾아보면 안드로이드 개발자 사이트에서는 이렇게 설명하고 있다.
어플리케이션 환경에 관한 글로벌 정보에 접근하기 위한 인터페이스로 안드로이드 시스템이 구현해 제공하는 추상 클래스이다. 애플리케이션의 리소스와 클래스 에 접근할 수 있게 해주며, Activity 실행, 브로드캐스팅, Intent 수신 등 애플리케이션 단계의 API호출 작업을 가능하게 해준다.
도대체 이게 무슨말일까? 한번 하나씩 살펴보자
우선 Context는 어플리케이션이 사용하고 있는 리소스나 클래스에 접근할 수 있도록 해주며, 어플리케이션의 컴포넌트들을 호출하는 것과같은 작업을 요청한다고 한다.
그렇다! Context는 결국 애플리케이션의 정보나, 애플리케이션과 관련된 시스템 작업에 접근하기위해 사용하는 중개인같은 녀석인것이다! 우리는 Context를 통해 애플리케이션의 리소스, 데이터나 관련된 시스템 작업에 접근할 수 있는 것이다.
그렇다면 왜 Context를 사용하는 것일까? 안드로이드와는 다르게 iOS나 Window같은 플랫폼에서는 직접적으로 시스템 함수를 호출해 시스템 작업을 수행하거나 직접적으로 애플리케이션에 접근한다.
하지만 안드로이드에서 이러한 작업은 반드시 Context객체에 생성되어 있는 메서드(함수)를 사용해야만 수행이 가능하다. 대체 왜 안드로이드는 직접적으로 접근하는 방식을 사용하지 않는것일까? 이걸 알기 위해서는 우선 프로세스와 애플리케이션의 관계에 대해 알아야한다.
일반적으로 우리가 프로그램이라 부르는 것들은 아직 실행되고 있지않은 상태를 의미한다. 이러한 프로그램들이 실행되기 위해서는 메모리에 해당 프로그램의 코드들과 리소스같은 요소들이 할당되어야 하는데 이렇게 메모리에 할당되어 실행되고 있는 상태의 프로그램을 프로세스라고 한다. 그리고 애플리케이션역시 프로그램이기 때문에 실행되게 되면 메모리에 프로세스가 할당되며 실행된다.
안드로이드가 아닌 다른 플랫폼(iOS, Window 등)에서는 프로세스와 애플리케이션이 직접 연결되기 때문에 애플리케이션이 실행되면 프로세스가 생성되고, 애플리케이션종료되면 프로세스가 사라지며, 각각의 애플리케이션이 해당 애플리케이션의 프로세스 와 함께 동작한다. 이렇게 애플리케이션 자체가 프로세스와 연결되어 동작하기 때문에 매개체 없이 직접적으로 애플리케이션과 관련된 작업들을 수행할 수 있는 것이다.
(프로세스에 적혀진 코드에서 나타내는 애플리케이션이 곧 프로세스와 연결된 애플리케이션이기때문에)
하지만 안드로이드의 경우 프로세스와 애플리케이션이 연결되지 않고 서로 따로 관리된다.
‘따로 관리 된다?’이게 과연 무슨말일까? 앞서 알아보았듯 다른 플랫폼의 경우 애플리케이션의 실행과 종료에 따라 프로세스가 함께 생성, 소멸한다. 서로 연결되어 모든것이 관리된다는 말이다.
하지만 안드로이드는 운영체제가 프로세스를 관리하고 안드로이드시스템에서 애플리케이션에대한 것들을 관리한다. 즉 프로세스와 애플리케이션을 분리해서 다르게 관리하고 있다는 것이다. 이러한 특징 때문에 안드로이드의 애플리케이션은 독특한 특징을 가지게 되는데 안드로이드는 애플리케이션이 종료되어도 프로세스가 소멸하지 않고 남아있을 수 있다.
정말 프로세스와 애플리케이션이 아무런 연결없이 동작한다. 그렇다면 왜 안드로이드는 이런 방식을 사용하고 있을까?
이러한 방식을 사용하는 이유는 여러가지가 있지만, 가장 큰 이유 중 하나는 모바일 디바이스에서 보다 효율적인 멀티태스킹을 제공하기 위해서다.
모바일 환경에서 애플리케이션은 아주 짧게, 반복적으로 사용되며, 모바일 디바이스의 경우 메모리 공간도 많지 않아 제한이 많다. 따라서 멀티태스킹 작업시 새로운 어플리케이션을 짧은 시간내에 실행하기에는 여러가지 제약이 따르는데, 이를 해결하기위해 결국 프로세스와 애플리케이션을 분리하는 방식을 선택한 것이다.
안드로이드에서는 사용자가 애플리케이션을 실행하고 있지 않아도 프로세스가 소멸된 상태가 아니기 때문에 다시 애플리케이션을 실행 할 경우 이미 실행되어있는 프로세스를 사용해 앱을 실행시켜 보다 빠른 멀티태스킹을 제공하게 되었다.
이제 우리는 안드로이드가 운영체제에서 프로세스를 관리하고, 시스템에서 애플리케이션을 관리한다는 것을 알았다. 그렇다면 프로세스에 있는 코드들은 대체 어떻게 시스템에서 동작하고 있는 애플리케이션이 내가 접근하고자 하는 애플리케이션인지 알 수 있을까?
그렇다 Context가 등장한다. Context는 자신이 어떤 애플리케이션인지 나타내는 역할을 해주면서, 동시에 해당 애플리케이션과 소통하는 인터페이스 역할을 하는 소중한 존재였던 겄이다!
(Activity Manager Service라는 애플리케이션의 정보를 관리해주는 애플리케이션에 접근하기 위한 역할이 있지만 이 내용에 대해서까지 설명하면 너무 길어지니 궁금하면 따로 찾아보도록하자)
이제 앞의 내용을 취합해 왜 Context를 사용하는지 요약해보자.
프로세스 = 어플리케이션으로 동작하는 다른 플랫폼과는 다르게 안드로이드 플랫폼은 프로세스와 애플리케이션이 완전 따로 놀고, 애플리케이션이 동작할때 자신이 해당 애플리케이션임을 나타내기위해 Context를 사용하는 것이라는걸 알 수 있다.
이제 왜 Context를 사용하는지 알았으니 Context는 어떤것들이 있는지 생각해볼 수 있게 되었다. 앞서 알아보았듯 Context는 해당 애플리케이션에 접근하거나, 애플리케이션에 필요한 시스템작업에 접근하도록 해준다. 즉, Context는 애플리케이션단위에서 식별과 작업에 접근을 위해 필요하다는걸 알 수 있게된다.
하지만 안드로이드의 컴포넌트들에 대해 배우면서, 또 앞서 프로세스와 애플리케이션에대해 이야기하면서, 우리는 안드로이드는 앱이 실행되고 종료 되지 않아도 앱의 컴포넌트가 실행될 수 있다는 것을 알 수 있었다. 그렇기에 앱의 컴포넌트가 생성될 떄 즉, 다른 앱에서 호출된 컴포넌트가 생성되는 경우에도 Context가 필요하다는걸 알 수 있다. 이것이 바로 인터넷에 Context에 대해 찾으면 흔히 나오는 Application Context와 Activity Context (컴포넌트의 Context)를 나타낸다.
제일 처음 이야기했듯 Context는 ‘인터페이스’이다. (정확히는 abstract 클래스) 그래서 메서드들을 명시만 할뿐 실제 구현되어있지는 않은데, 그렇다면 우리는 어떻게 Context객체에 구현된 메서드들을 사용할 수 있는걸까?
우선 추상클래스인 Context클래스의 메서드들은 ContextImpl이라는 클래스를 통해 실제 메서드들이 어떻게 작동되어야하는지 구현된다. ContextImpl클래스에 접근할때는 ContextWrapper라는 클래스를 통해 접근하게 되는데 왜 이런식으로 접근하는지 궁금하다면 나중에 Proxy패턴에 대해 찾아보길 바란다.
이제 이 ContextWrapper클래스를 Context가 필요한 각각의 클래스 (Application, Activity, Service)가 상속받아서 사용하게 되는 것이다.

요약하자면 Context는 ContextImpl이라는 클래스를 통해 메서드들이 어떻게 사용되어야하는지 구현되며, ContextImpl에는 ContextWrapper를 통해 접근한다.
그리고 이 ContextWrapper를 상속받은 각 클래스들이 생성될때 비로소 Context객체가 생성이 되는것이다.
이렇듯 Context는 애플리케이션이나 컴포넌트의 생명주기와 함께하며 해당 요소에 접근을 위한 객체이기 때문에 메모리의 낭비를 줄이기 위해서는 적절한 Context를 사용하는 것이 중요하다.
특히 Application단계의 Context를 사용해 작업을 수행할 경우 해당 작업이 정말 Application단계에서 필요한 작업인지 잘 확인해야하는데, 앞서 알아본것처럼 안드로이드 애플리케이션의 프로세스는 애플리케이션이 종료되어도 남아있을 수 있기 때문에 Application Context를 과도하게 사용시 메모리 효율성이 떨어질 수 있기 때문에 정말 필요한 경우가 아니라면 컴포넌트 단위의 Context를 사용하는것이 바람직하다.
참고 자료
네이버 블로그 - 안드로이드 Context 이야기
네이버 블로그 - [번역] 안드로이드의 멀티태스킹 (Multitasking the Android Way)
Medium - 안드로이드 Context 는 어떻게 생성될까?
티스토리 - [Android]Context
뤼튼 - chat GPT 4