티스토리 뷰


 
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
안드로이드 프로그램을 하다보면 컨텍스트(Context) 라는 용어가 종종 나옵니다. 그리고 여러가지
클래스 객체의 객체 생성자에서 Context 클래스를 요구하는 경우도 흔히 볼수 있습니다. 하지만, 많은
자료에서 컨텍스트에 대한 내용은 언급 자체가 되지 않거나 말 그래도 언급만 되어 있는 경우가 많아서
간단하게라도 컨텍스트의 개념을 잡기 위해 이 강좌를 준비했습니다.
1. 일반적인 의미의 "Context"
멀티태스킹(Multi-Tasking)을 지원하는 운영체제에서 Task 들은 운영체제가 정한 기준에 따라
짧은 시간동안 작업을 번갈아가면서 수행합니다. 따라서 운영체제는 해당 Task 들의 수행상태를
기억하기 위해서 Task 마다 실행 상태에 대한 정보를 구성하고 있는데 이것이 "Context" 입니다.
그렇기때문에 Context 는 "Task Context" 를 의미합니다. 그리고 Task Context 가 가지는 내용은
보통 CPU 의 레지스터 정보, Task 가 사용하는 메모리 등이 포함되어 있습니다. ( 운영체제에
따라서 이 정보는 달라질 수 있습니다. )
2. 안드로이드 시스템에서 Context 클래스의 역할
안드로이드 시스템은 여러가지 형태의 실행 형식( Activity, Service, ... )을 가지고 있습니다. 그렇기
때문에 클래스 구현상 중복된 실행 정보를 가질 수 밖에 없습니다. 따라서 이런 중복된 정보를 줄이고,
메소드를 일원화시키기 위하여 실행 클래스들의 상위클래스로써 Context 클래스를 제공하고 있습니다.
안드로이드 시스템에서 모든 실행 형식을 가지는 클래스들은 Context 클래스에서 상속을 받아
설계되었기 때문에 다형성을 적용하여 코드를 통일성있게 표현할 수 있습니다. 예를 들어
액티비티에서 정보를 전달하기위하여 Intent 클래스를 사용하는 경우 해당 액티비티를 Intent 클래스가
참조할 수 있도록 Intent 클래스의 생성자는 아래와 같이 선언되어야 합니다.
Intent(Activity activity, ... );
하지만 서비스도 Intent 클래스를 사용할 수 있기때문에 Intent 클래스는 서비스를 위하여 아래와 같은
생성자가 추가로 필요할 것입니다.
Intent(Service service, ... );
그리고 또 다른 형태의 실행 형식을 가지는 클래스가 추가된다면 Intent 클래스는 그 클래스를 위하여
객체생성자가 추가되어야하는 문제점이 생기게되어 시스템 입장에서는 유지보수가 곤란해집니다.
따라서 안드로이드 시스템은 모든 실행 형식과 관련된 클래스들을 Context 클래스에서 계승받았기
때문에 Intent 클래스의 객체 생성자를 아래와 같이 선언할 수 있습니다.
Intent(Context context, ... );
이렇게 되면 이제 이 생성자는 Activity 클래스든 Service 클래스든 둘 다 사용할 수 있을 뿐만 아니라
나중에 또 다른 실행 형식의 클래스가 추가되어도 수정없이 위 생성자를 사용할 수 있습니다.
예를들어, Activity 클래스에서 Intent 클래스를 사용할때는 Intent 클래스의 생성자에 this 를
명시해서 사용하면 됩니다. this 는 Activity 객체를 의미하지만 Activity 클래스가 Context 클래스의
자식 클래스이기 때문에 다형성에 의해서 사용이 가능합니다.
public class MyActivity extends Activity implements OnClickListener
{
public void onClick(View view)
{
// SecondActivity 를 실행시킬 것을 명시한 인텐트를 생성한다.
Intent act = new Intent(this, SecondActivity.class);
... 생략 ...
}
}
결론적으로 안드로이드 시스템에서 Context 클래스는 다형성을 사용할 목적으로 구현되었기 때문에
대부분의 함수들이 추상 메소드로 선언되어있고 그래서 그 자신도 추상 클래스입니다.

 

댓글