본문 바로가기
Android.Kotlin

[Android] Context 는 무엇이고 우리는 왜 사용하는가?

by 동동하다 2023. 11. 1.
반응형

안드로이드 개발자라면 Context라는 건 많이 들어보았을 것이다. 하지만 정확히 Context 가 무엇인지는 잘 알지 못한다.

Context가 무엇이고 어떨 떄 사용하는지 한번 알아보자

Context 란?

안드로이드에서 사용되는 Context 는 어디에서 온 것일까? Context는 안드로이드의 메인 프레임워크인 Android.jar 에 존재한다.

그럼 안드로이드 프레임워크는 무엇인가? 안드로이드 프레임워크는 안드로이드에서 동작하는 메인 애플리케이션이며 개발자가 만드는 애플리케이션은 그 메인 애플리케이션에서 동작하는 하나의 이벤트 핸들러이다. 미니 애플리케이션 (개발자가 만든 앱) 을 다운로드할 수 있는 메뉴를 가진 슈퍼 애플리케이션 (안드로이드 프레임워크) 이 있다고 생각하면 쉽게 이해된다.

안드로이드 프레임워크는 개발자가 만든 애플리케이션을 구동할 수 있고 제어할 수 있음에도 불구하고 구동 중인 애플리케이션에 다양한 정보를 제공해야 한다. 예를 들어 리소스의 경로, 리소스에 접근하기 위한 함수, 키-밸류 저장 내역 등이 있을 수 있다. 안드로이드는 이러한 정보와 함수를 Context라는 이름의 클래스로 전달한다.

 

Context를 통해 사용할 수 있는 함수

리소스 접근

우리의 애플리케이션이 설치될 때, string.xml, layout.xml, drawables와 같은 리소스들은 소스 코드와 분리된 특정 경로에 복사되어 상대 경로로 접근이 제한된다. 또한 대부분의 xml 파일은 파싱 하여 특정 값을 검색하기 어려운 파일이다. (실제로 바이너리 파일로 컴파일된 리소스 파일은 더욱 읽기 어렵다) 그래서 안드로이드는 리소스에 접근하기 위해 아래와 같은 함수를 사용한다.

getResources().getString()
getResources().getDrawble()
getResources().getColor()

시스템 API 사용

Context 를 통해서 유용한 API를 사용할 수 있다. 

예를 들어 키-밸류 저장소 (SharedPreference), 데이터 베이스, 설치된 다른 패키지 정보 가져오기, 퍼미션 관련 요청 같은 API를 들 수 있다. 

 

startActivity

새로운 액티비티를 호출하는 것은 안드로이드 개발에서 매우 중요하고 많이 사용되는 기능이다. startActivity 도 Context 를 통해 이루어진다.

Context와 컴포넌트

그럼 왜 이런 Context 가 글로벌하게 사용되지 않을까?

그 이유는 싱글 Context 애플리케이션이 거의 없기 때문이다. 정확하게 말하면 애플리케이션이 액티비티나 서비스 등 컴포넌트를 생성할 때마다 Context가 생성되며 해당 Context는 해당 컴포넌트에 할당된다.

ApplicationContext를 이용해서 모든 클래스에서 접근 가능한 static 변수를 가질 수 있다. 하지만 각각의 컴포넌트에 할당된 Context는 어떨까? 각각의 Context 는 종속된 컴포넌트의 테마에 따라 다른 성격을 가지게 되고 이것이 여러 Context 가 필요한 이유이다. 당연하게도 종속된 컴포넌트가 생명주기에 의해 종료되면 Context도 함께 종료된다.

데코레이터 디자인 패턴

Context는 데코레이터 디자인 패턴을 이용해서 구현된다. Context 자체는 추상 클래스이며 ContextImpl 클래스를 통해 인스턴스 된다.

애플리케이션, 액티비티, 서비스 등 컴포넌트들은 ContextWrapper에서 파생된 클래스이다. ContextWrapper는 데코레이터 디자인 패턴에서 사용되는 구현 클래스로 해당 클래스는 Context 객체를 가지고 있어 해당 Context 객체를 통해 메소드를 호출할 수 있다. 이러한 패턴으로 인해 Context는 컴포넌트들과 분리될 수 있고 더 액티비티나 서비스의 참조 전달보다 Context의 참조를 전달하는 게 더 안전하다

반응형