amplitude.init("2e2e5a386856efdf3237cf254a9d14d9"

[개념 콕] 안드로이드 Context

내일배움캠프 수료생이 개발에 꼭 필요한 핵심 개념만 콕 집어 드립니다.
Jun 05, 2024
[개념 콕] 안드로이드 Context
✍🏼
안드로이드 입문자 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 안드로이드 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
 

Context란?

우선 Context에 대한 설명을 찾아보면 안드로이드 개발자 사이트에서는 아래와 같이 설명하고 있습니다.
“어플리케이션 환경에 관한 글로벌 정보에 접근하기 위한 인터페이스로 안드로이드 시스템이 구현해 제공하는 추상 클래스이다. 애플리케이션의 리소스와 클래스 에 접근할 수 있게 해주며, Activity 실행, 브로드캐스팅, Intent 수신 등 애플리케이션 단계의 API호출 작업을 가능하게 해준다.”
무슨 의미일까요? 하나씩 살펴봅시다.
우선 Context는 애플리케이션이 사용하고 있는 리소스나 클래스에 접근할 수 있도록 해주며, 어플리케이션의 컴포넌트들을 호출하는 것과같은 작업을 요청한다고 합니다. 즉, context는 결국 애플리케이션의 정보나, 애플리케이션과 관련된 시스템 작업에 접근하기 위한 중개인같은 존재입니다. 우리는 context를 통해 애플리케이션의 리소스, 데이터나 관련된 시스템 작업에 접근할 수 있습니다.
 

Context를 사용하는 이유

그렇다면 왜 Context를 사용하는 것일까요? 안드로이드와는 다르게 iOS나 Window같은 플랫폼에서는 직접적으로 시스템 함수를 호출해 시스템 작업을 수행하거나 직접적으로 애플리케이션에 접근합니다. 하지만 안드로이드에서 이러한 작업은 반드시 Context객체에 생성되어 있는 메서드(함수)를 사용해야만 수행할 수 있습니다. 대체 왜 안드로이드는 직접적으로 접근하는 방식을 사용하지 않을까요? 이를 알기 위해서는 우선 프로세스와 애플리케이션의 관계에 대해 알아야 합니다.
 

1. 프로세스와 어플리케이션의 관계

일반적으로 우리가 프로그램이라 부르는 것들은 아직 실행되고 있지 않은 상태를 의미합니다. 이러한 프로그램들이 실행되기 위해서는 메모리에 해당 프로그램의 코드들과 리소스같은 요소들이 할당되어야 하는데 이렇게 메모리에 할당되어 실행되고 있는 상태의 프로그램을 프로세스라고 합니다. 그리고 애플리케이션 역시 프로그램이기 때문에 실행되게 되면 메모리에 프로세스가 할당되며 실행됩니다.
안드로이드가 아닌 다른 플랫폼(iOS, Window 등)에서는 프로세스와 애플리케이션이 직접 연결되기 때문에 애플리케이션이 실행되면 프로세스가 생성됩니다. 애플리케이션이 종료되면 프로세스가 사라지며, 각각의 애플리케이션이 해당 애플리케이션의 프로세스와 함께 동작하는 것이죠. 이렇게 애플리케이션 자체가 프로세스와 연결되어 동작하기 때문에 매개체 없이 직접적으로 애플리케이션과 관련된 작업들을 수행할 수 있습니다.
 

2. 안드로이드에서의 프로세스와 어플리케이션

하지만 안드로이드의 경우 프로세스와 애플리케이션이 연결되지 않고 따로 관리됩니다. 앞서 말한 것처럼 다른 플랫폼의 경우 애플리케이션의 실행과 종료에 따라 프로세스가 함께 생성, 소멸합니다. 서로 연결되어 모든 것이 관리된다는 말입니다.
하지만 안드로이드는 운영체제가 프로세스를 관리하고 안드로이드 시스템에서 애플리케이션에 대한 것들을 관리합니다. 즉 프로세스와 애플리케이션을 분리해서 다르게 관리하고 있다는 것이죠. 이러한 특징 때문에 안드로이드의 애플리케이션은 독특한 특징을 가지게 되는데 안드로이드는 애플리케이션이 종료되어도 프로세스가 소멸하지 않고 남아있을 수 있습니다. 프로세스와 애플리케이션이 연결없이 동작하는 것이죠. 그렇다면 왜 안드로이드는 이런 방식을 사용하고 있을까?
 
이러한 방식을 사용하는 이유는 여러가지가 있지만, 가장 큰 이유 중 하나는 모바일 디바이스에서 보다 효율적인 멀티태스킹을 제공하기 위함입니다.
모바일 환경에서 애플리케이션은 아주 짧게, 반복적으로 사용되며, 모바일 디바이스의 경우 메모리 공간도 많지 않아 제한이 많다. 따라서 멀티태스킹 작업 시 새로운 어플리케이션을 짧은 시간내에 실행하기에는 여러가지 제약이 따르는데, 이를 해결하기 위해 결국 프로세스와 애플리케이션을 분리하는 방식을 선택한 것입니다.
안드로이드에서는 사용자가 애플리케이션을 실행하고 있지 않아도 프로세스가 소멸된 상태가 아니기 때문에 다시 애플리케이션을 실행 할 경우 이미 실행된 프로세스를 사용해 앱을 실행시켜 보다 빠른 멀티태스킹을 제공합니다.
 

3. 그래서, Context 왜 쓸까?

이제 우리는 안드로이드가 운영체제에서 프로세스를 관리하고, 시스템에서 애플리케이션을 관리한다는 것을 알았습니다. 그렇다면 프로세스에 있는 코드들은 대체 어떻게 시스템에서 동작하고 있는 애플리케이션이 내가 접근하고자 하는 애플리케이션인지 알 수 있을까요?
여기에서 Context가 등장합니다. Context는 자신이 어떤 애플리케이션인지 나타내는 역할을 해주면서, 동시에 해당 애플리케이션과 소통하는 인터페이스 역할을 하는 소중한 존재였던 것입니다.
 
즉, 프로세스 = 어플리케이션으로 동작하는 다른 플랫폼과는 다르게 안드로이드 플랫폼은 프로세스와 애플리케이션이 따로 작동하고, 애플리케이션이 동작할 때 자신이 해당 애플리케이션임을 나타내기위해 Context를 사용하는 것입니다.
 
하지만 안드로이드의 컴포넌트들에 대해 배우면서, 또 앞서 프로세스와 애플리케이션에 대해 이야기하면서, 우리는 안드로이드는 앱이 실행되고 종료 되지 않아도 앱의 컴포넌트가 실행될 수 있다는 것을 알 수 있었습니다. 그렇기에 앱의 컴포넌트가 생성될 때 즉, 다른 앱에서 호출된 컴포넌트가 생성되는 경우에도 Context가 필요하다는걸 알 수 있습니다. 이것이 바로 인터넷에 Context에 대해 찾으면 흔히 나오는 Application Context와 Activity Context (컴포넌트의 Context)를 나타냅니다.
 

Context 발생 원리

제일 처음 이야기했듯 Context는 ‘인터페이스’, 정확히는 abstract 클래스입니다. 그래서 메서드들을 명시 할 뿐 실제 구현되어 있지는 않습니다. 그렇다면 우리는 어떻게 Context객체에 구현된 메서드들을 사용할 수 있는 것일까요?
우선 추상클래스인 Context클래스의 메서드들은 ContextImpl이라는 클래스를 통해 실제 메서드들이 어떻게 작동되어야 하는지 구현됩니다. ContextImpl클래스에 접근할때는 ContextWrapper라는 클래스를 통해 접근하게 되는데 왜 이런식으로 접근하는지 궁금하다면 나중에 Proxy패턴에 대해 찾아보길 바랍니다.
이제 이 ContextWrapper클래스를 Context가 필요한 각각의 클래스 (Application, Activity, Service)가 상속받아서 사용하게 되는 것이죠.
요약하자면 Context는 ContextImpl이라는 클래스를 통해 메서드들이 어떻게 사용되어야하는지 구현되며, ContextImpl에는 ContextWrapper를 통해 접근합니다. 그리고 이 ContextWrapper를 상속받은 각 클래스들이 생성될 때 비로소 Context객체가 생성 되는 것이죠.
 
notion image
 
 

Context 사용시 주의점

이렇듯 Context는 애플리케이션이나 컴포넌트의 생명주기와 함께하며 해당 요소에 접근을 위한 객체이기 때문에 메모리의 낭비를 줄이기 위해서는 적절한 Context를 사용하는 것이 중요합니다.
특히 Application단계의 Context를 사용해 작업을 수행할 경우 해당 작업이 정말 Application단계에서 필요한 작업인지 잘 확인해야하는데, 앞서 알아본것처럼 안드로이드 애플리케이션의 프로세스는 애플리케이션이 종료되어도 남아있을 수 있기 때문에 Application Context를 과도하게 사용시 메모리 효율성이 떨어질 수 있기 때문에 정말 필요한 경우가 아니라면 컴포넌트 단위의 Context를 사용하는것이 바람직합니다.
 
 

내일배움캠프는 개발에 필요한 핵심만 배웁니다

지금까지 꼭 필요한 유니티 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 게임 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
 
 
 
CREDIT
글 | 배영수 내일배움캠프 수료생 편집 | 정효재 팀스파르타 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
Share article
Subscribe to our newsletter
RSSPowered by inblog