괴도군의 블로그

[Android] this / MainActivity.this 본문

#프로그래밍/Android

[Android] this / MainActivity.this

괴도군 2016. 12. 5. 21:48
반응형


안녕하세요 괴도입니다.

오늘은 this에 대해서 알아보도록 하겠습니다.


안드로이드를 포함한 자바에서 this는 자신의 객체를 가리킵니다.

예를들어 Box라는 클래스가 있을경우

Box box = new Box();

위와 같이 객체를 생성해서 사용하듯이

클래스안에서 자신의 객체를 이용할때는 this를 통해서 처리합니다.
(물론 객체가 생성되어야 클래스안의 this도 사용되겠죠)

this는 객체이기때문에 this.함수명 / this.변수명 으로 public접근자를 접근할 수 있구요

this()를 통해서 생성자를 표시하기도합니다.(이부분은 생성자 안에서만 사용가능합니다.)

여기까지는 일반 자바설명입니다.

---------------------------------------------------------

안드로이드에서 보통 MainActivity에서 this를 많이 사용합니다.
왜냐하면 this인 MainActivity클래스에는 많은 메소드와 변수들이 들어있기 때문입니다.
상속구조를 살펴보자면

java.lang.Object
   ↳android.content.Context
    ↳android.content.ContextWrapper
     ↳android.view.ContextThemeWrapper     
      ↳android.app.Activity 


이런식으로 포장이 되어있죠
Context를 많이 보셨을텐데 Activity의 부모가 Context입니다.
이 Context에는 많이 사용하는 startActivity(Intent intent)등 메소드가 구현되어있고
SharedPreference도 Context의 getSharedPreference(String name, int mode)를 통해서 사용해야하죠 
또 이 Context를 통해 구현된 메소드들을 사용하려면 파라미터로 Context를 넣어줘야하죠
이렇듯 Context, 즉 Activity는 모든 기능들을 사용할때 필요하다고 보시면 됩니다.
그래서 this로 Activity의 객체를 전달해주는것이죠

그런데 메인액티비티에서 this를 사용하기만 하면되는데
MainActivity.this로 적어야하는부분이 있습니다.
그것은 다른 인터페이스의 구현부분에서 사용시에는 그 인터페이스 자체를 가리키게되기때문에
정확히 지정해주기위해서 MainActivity를 앞에 붙여주는것입니다.

그렇다고 아예 다른 자바파일에서도 똑같이 사용하시면 안됩니다.
그곳에서 this는 그 클래스의 객체일뿐입니다. 
다른클래스에서 MainActivity.this로 사용하시면 안되는 이유는 처음에도 썼듯이..
this는 클래스 안에서만 효과가 있습니다.
(아마 this의 접근제어자가 private/protected 겠죠?)

위에서 인터페이스의 구현부분에서 사용시라고 말을 했는데 글로 설명하니 어렵게 느껴질수 있겠네요


1
2
3
4
5
6
7
8
9
10
11
12
13
Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //이부분은 new View.OnClickListener인터페이스의 안이기때문에
                //this를 사용하면 인터페이스만 가리키게됩니다.
                //메인액티비티의 이름이 MainAcitivity일때 
                // MainActivity.this라고 쓰면 사용이 가능합니다.
                MainActivity.this.startActivity(new Intent(MainActivity.this,Activity.class));
                //Intent(Context packageContext, Class<?> cls)
                //인텐트를 사용할때도 context가 필요합니다
            }
        });
cs

 



반응형
Comments