오늘 팀 회고를 진행하며
this
와this@MainActivity
의 차이점이 뭔지에 대한 얘기가 나왔다. 생각해보니 개발을 하며 Context를 인자로 줘야 할 때 this, applicationContext() 등 작동이 되는 것으로 넣어서 구현한 적이 많았던 것 같다. 😅 Context 개념은 확실히 이해 할 필요가 있다고 생각해 정리해보려 한다.
Context
는 애플리케이션 현재 상태의 맥락(Context)를 의미한다. 새롭게 생성 된 객체가 현재 무슨 일이 일어나고 있는지를 알 수 있도록 하며 그에 따라 애플리케이션과 액티비티에 대한 정보를 얻기 위해서 Context를 사용한다.
- Context는 크게 두 가지의 역할을 하고 있는 추상 클래스이다.
- 앱에 관하여 시스템이 관리하고 있는 정보에 접근한다.
(resource, class, 애플리케이션 환경 정보 등)
- 안드로이드 시스템 서비스에서 제공하는 API 호출
(startActivity(), bindService())
Application Context | Activity Context |
---|---|
applicationContext | baseActivity |
application | this@ActivityName |
Application 생명주기에 귀속되며 싱글톤으로 구현되어 있다. Application이 살아 있는 동안 동일한 하나의 객체를 반환하며, Application이 살아 있는 동안에는 변경되지 않는다. GUI와 관련된 작업은 불가능하며 현재의 Context와 분리된 LifeCycle을 가진 Context가 필요하거나 Activity의 범위를 넘어서 Context를 전달 할 때 사용한다.
Activity의 생명주기에 귀속되며 Activity가 destroy 될 때 같이 destroy 된다. 그러므로 Activity가 종료 되었을 때도 남아 있어야 한다면 Activity Context가 아닌 Application Context를 사용해야 한다. Activity는 UI 화면을 가지고 있으므로 GUI 작업이 가능하다. 따라서,
Dialog와 같이 Activity상의 UI를 제어해야 할 부분이 있다면 ActivityContext (this@ActivityName)을 사용하는 것이 올바르다.
this 키워드는 해당 키워드를 사용한 클래스 자신을 지칭할 때 사용한다.
this 키워드를 단독
으로 사용 한 것은해당 위치에서 가장 가까운 범위의 클래스를 의미
한다. 즉, 클래스 내의 다른 클래스나 인터페이스의 인스턴스를 동적으로 생성하여 사용하는 경우에 this 키워드를 사용할 경우사용 한 위치에 따라 this 키워드가 의미하고 있는 클래스가 달라질 수 있다.
이러한 문제를 해결하고자 this@ActivityName과 같이 표기한다. MainActivity의 경우 내부 클래스에서 this를 적으면 MainActivity의 this가 아닌 내부 클래스의 this가 되는 것이고MainActivity의 this를 원할 경우 this@MainActivity 형식으로 지정
한다.