안드로이드 Context 개념 정리
안드로이드 Context에 대해서 구글링 해보면 참 더럽게 알아듣기 힘들다.
그래서 내 방식으로 이해한 Context에 대해 정리해 봅니다.
이 글은 public 저작권으로 상업적 이용, 인용 등 아무 제한 없이 어디서든 가져다 쓰셔도 됩니다. by sharpen
안드로이드 개발을 하다보면 아래 코드 처럼 public MultiCheckBox(Context context) { 같은 소스코드를 자주 볼 수 있죠.. 그런데 기본서에는 context가 뭔지 설명 안하고 간단하게 넘어가서... 자바를 공부하고 온 사람들도 이해 안가는 상태로 쓰게 됩니다.
public class MultiCheckBox extends LinearLayout {
private CheckBox checkBox;
private CheckBox checkBox2;
public MultiCheckBox(Context context) {
super(context);
init(context);
}
그래서 일상생활에서 자주 쓰는 것들 중에 비유를 들어봅니다.
우리가 윈도우7을 쓰면서 자주 쓰는 탐색기 창을 열어보겠습니다.
위 탐색기의 E드라이브 안에는 다양한 폴더가 들어있습니다. 필자가 좋아하는 Animation(애니메이션), Comics(만화) 폴더 같은 것들이 있다. 당신의 야구 동영상 폴더는 제외할테니... 안심하시길... ('-' )
우리가 탐색기에서 흔히 하는 작업 중 하나가 그 폴더나 파일에서 마우스 우클릭해서 그 폴더나 파일의 팝업 메뉴창을 띄우곤 합니다. 다음 그림을 참고해 보세요.
아무런 폴더에서나 마우스 우클릭을 하게 되면 그 폴더에 대한 메뉴들이 팝업되어 나오는 게 보이시죠?
이 메뉴를 가리켜 Context 메뉴라고 부릅니다.
Context는 영어로 문맥이라고 합니다.
자기가 고른 폴더가 달라도 그 선택한 녀석이 폴더라면 어떤 폴더를 고르건 Context 메뉴에 뜨는 항목들은 같죠?
위 그림에서는 바로가기 만들기(S), 삭제(D), 이름바꾸기(M), 속성(R) 과 같은 그림에 떠있는 모든 항목들은 어떤 폴더에서 우측 마우스 클릭을 하건 동일한 항목들[ 바로가기 만들기(S), 삭제(D), 이름바꾸기(M), 속성(R) ]을 보여줄 것이다.
자~ 그럼 아까 언급한 Animation폴더와 Comics폴더에서 마우스우클릭을 하고 Context 메뉴를 뜨게 한다고 생각해보자.
Context메뉴에서 Animation폴더에서 속성을 눌렀을 때 뜨는 그 폴더에 대한 정보와
Comics폴더에서 속성을 눌렀을 때 뜨는 그 폴더의 정보가 동일하게 나올까요?
필자의 폴더 기준으로 현재 Animation 속성의 일반 탭에 나오는 정보는
종류 : 파일폴더
위치: E:\
크기: 60.7GB
Comics 속성의 일반 탭에 나오는 정보는 (E드라이브가 아니라 D드라이브에 있는 폴더를 선택했다 치더라도)
종류: 파일 폴더
위치: D:\
크기: 7.84GB
이렇게 각 폴더의 용량에 대한 정보가 다르게 나온다.
내 오른쪽 마우스 클릭한 위치에 있는 폴더의 정보에 따라 마우스 우클릭 했을 때 나오는 Context 메뉴의 [속성] 을 선택하면
선택한 폴더에 따라 같은 속성 항목이지만 다른 드라이브 위치, 다른 용량을 표시해 준다.
그러니까 context는 어떤 것을 고른 것인지 그 상황에 맞는 맥락을 나타내 준다고 생각을 하면 됩니다.
안드로이드 App을 구성하는 Activity는 Context를 상속받는다.
그럼 여러개의 Activity가 있다고 해보자.
A , B, C 액티비티가 있다고 하고 각 액티비티에서 마우스 우클릭해서
선택한 문맥에 맞는 액티비티 정보를 얻는다고 생각해 보자.
어떤 액티비티 소속의 정보인가에 따라 Context 정보는 각자 다를 것입니다.
어떤 Activity 혹은 어떤 application 인가에 대해서 구별하는 정보가 context라고 이해하면 코드를 작성하는데 큰 어려움이 없으실 겁니다.
추가: 그런데 휴휴휴 님 사이트에 보면 context는 지문이나 홍채 인식 같은 자가 정보가 아니라 사원증이나 주민등록증과 같은 신분증과 같은 개념이란 언급을 볼 수 있다. 액티비티 자신의 존재 자체로 증명하는 것이 아니라 사원증이나 신분증에 적혀있는 정보도 마찬가지로 누구의 신분증 인가에 따라
이름 : 홍길동
주민등록번호 : 340114-123**** 과 같이
발급 날짜: 1934년 01월 14일
동일한 목록의 정보를 알려 주지만 그 하나 하나의 이름이나 실제 주민번호 등은 각각 다른 정보를 갖고 있습니다.
이런 맥락이라는 의미로 context를 사용한다고 생각하시면 될 것 같습니다.
https://blog.naver.com/huewu/110085457720?viewType=pc
이상... Android Context 에 대한 비유를 마치겠습니다.
context 코드 유형.
유형1.
public class MultiCheckBox extends LinearLayout {
private CheckBox checkBox;
private CheckBox checkBox2;
public MultiCheckBox(Context context) {
super(context);
init(context);
}
자 위의 코드는 리니어레이아웃을 이용해서 커스텀 뷰를 만드는 데 쓰는 코드입니다.
이런 커스텀 뷰를 만들면 결국 이런 뷰는 어떤 액티비티에선가 사용하기 위해 작성합니다.
그럼 저 뷰는 사용되는 시점에서 어떤 액티비티에서 보여지는 지에 대한 정보가 필요하다.
그래서 context를 상속한 액티비티에 대한 정보를 사용해준다. 다음과 같은 식이다.
MultiCheckBox mcb = new MulticheckBox(this);
위 코드는 액티비티 안에 속하는 커스텀뷰로 만든 MultiCheckBox를 호출해서 쓰려는 코드일 것이다.
그럼 이 this는 무엇을 의미하는가? 그 Activity 자신을 의미한다. (만약 B_Activity에서 쓴다면 B_Activity.this를 의미할 것이다.)
이를 테면 이런 의미인 것이다.
그 코드가 사용된 곳에서 쓰였다고 가정하자.
MultiCheckBox mcbMain = new MulticheckBox(MainActivity.this);
MultiCheckBox mcbScore = new MulticheckBox(ScoreActivity.this);
이 뷰를 메인 액티비티에서 쓰겠어. 아니야 이뷰는 스코어 액티비티에서 쓰겠어!
이런 식으로 어떤 액티비티에서 활용하겠어 등등과 같은 정보가 필요할 겁니다
유형2.
private void init(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.multi_checkbox, this, true);
안드로이드에서 자주 쓰는 LayoutInflater 에서도 context라는 것을 볼 수 있는데,
이 경우에는 xml로 만든 ui를 어디다 부풀릴 건지에 대한 정보가 있어야 할 것이다.
그럼 어디겠나? Activity안의 어딘가에 배치해서 만들 것 아닌가.
결론 :
어떤 Activity 혹은 어떤 application 인가에 대해서 구별하는 정보가 context라고 이해하면 코드를 작성하는데 큰 어려움이 없을 것이라 본다.