Android 에서 Context가 무엇일까

K4keye·2022년 1월 18일
0

궁굼

Context라는 알 것 같은 하지만 모르겠는 이 친구에 대해 알아보려 한다.
흔히 activity를 띄우거나 앱의 패키지 이름이나 리소스의 데이터를 가져올 때 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.

Context는 애플리케이션에 대해 시스템이 관리하고 있는 정보에 접근하거나
안드로이드 시스템 서비스에서 제공하는 API를 사용할 수 있는 기능을 가지고 있다.
위의 내용을 보면 정보에 접근하거나 기능을 사용할 때 필요한 것으로 보인다.

Context는 마치 신분증 같은 생각이 든다.

Context


Context 를 왜 사용해야 하는 걸까

안드로이드에서는 애플리케이션과 프로세스가 별도로 관리된다.
프로세스는 OS에 의해 관리되고
애플리케이션은 ActivityManagerService에 의해 관리된다.
즉 애플리케이션의 관련 정보를 가지고 있는 것은 ActivityManagerService이다.

ActivityManagerService는 통합 문의 채널 역할 을 수행한다.
즉 하나만의 앱에 대해 명령을 수행하는 것이 아닌
여러 앱을 통합해서 관리하는 구조이다.

위에서 Context는 신분증과 같다고 하였다
그 이유는 위 그림으로 알 수가 있는데
ActivityManagerService 입장에서는 자신에게 온 요청이 어느 앱의 요청인지 파악해야 작업을 수행할 수 있다.
여기서 어느 앱인지 식별할 수 있는 정보가 Context이다.

그렇기 때문에 Context는 자신이 누구인지 알리는 신분증 같은 존재이다.

Context의 종류

Context는 Application Context 와 Activity Context로 구분된다

Application Context는 각 Application에서 유일하다.
싱글톤이며 앱이 살아있는 동안 변경이 일어나지 않는다.

Activity Context는 각 Activity에 유일하다.
Activity는 Application의 기본 요소이기 때문에 Activity는 Application에 종속되고
결과적으로 Application Context 안에 ActivityContext가 존재하게 된다.

메모리 누수

결국 위와 같이 ActivityContext는 Application Context 안에 있으니까
Application Context만 쓰면 괜히 고민해서 사용할 필요가 없다고 생각할 수 있다.
하지만 각 종속을 생각하면 그렇지 않다.
ActivityContext는 Activity에 종속되어 있다.
즉 Activity가 파괴되면 ActivityContext도 같이 파괴가 된다.

하지만 Application Context에 Activity를 참조하게 되면
Activity가 파괴되더라도 참조가 유지가 되기 때문에
Activity가 가비지에 의해 정리되지 않는다.
따라서 메모리 누수가 발생한다.
오래 보존해야 하는 Context가 있을 때 말고는 사용하지 않도록 해야 한다.

결론

안드로이드는 여타 다른 OS 플랫폼처럼 <애플리케이션 = 프로세스> 의 구조가 아니다.
따라서 애플리케이션 관련 정보를 얻기 위해서는 자신이 어떤 프로세스인지 알려주는 것이 아닌
자신이 부여받은 신분증 을 제시하는 것으로 관련 정보를 얻을 수 있다.

profile
쉬엄쉬엄 마치 취미처럼 공부하자

0개의 댓글