질문 정리

Toast.makeText()를 사용할 때, context를 달라고 하면 this를 입력하는 이유는 뭘까?

five2week 2023. 3. 14. 23:31

안드로이드 스튜디오를 사용하면서 Toast를 사용하게 될 일이 종종 있습니다.

toast

여기서 context는 Toast가 표시될 Context, text는 Toast에 표시될 text, duration은 Toast가 표시될 시간을 의미합니다.따라서 아래와 같은 형식으로 사용할 수 있습니다.

Toast.makeText(getApplicationContext(), "Hello, world!", Toast.LENGTH_SHORT).show();

 

이 코드는 getAppicationContext()를 사용하여 현재 애플리케이션의 컨텍스트를 가져오고, "Hello, world!"라는 text를 짧게 표시합니다.

 

하지만 우리는 아래와 같은 형식으로 더 많이 사용합니다.

Toast.makeText(this, "Hello, world!", Toast.LENGTH_SHORT).show();

Toast.makeText()를 사용하기 위해서는 첫번째 매개변수로 Context 객체를 전달해야합니다.


Context

안드로이드에서 Context는 애플리케이션에 대한 전역 정보를 제공하는 인터페이스입니다. Context는 애플리케이션의 실행 환경에 대한 정보를 포함하며, 애플리케이션의 리소스 및 클래스에 대한 접근을 제공합니다.

 

Context는 안드로이드 시스템 서비스와 애플리케이션 간의 상호작용을 위한 핵심 개념 중 하나입니다. 예를 들어, 액티비티, 서비스, 브로드캐스트 리시버 등 모든 구성 요소는 Context를 포함합니다. 또한, 리소스 매니저, 알림 매니저, 애플리케이션 상태, 애플리케이션 정보 등과 같은 다양한 시스템 서비스도 Context를 사용하여 애플리케이션과 상호작용합니다.

 

안드로이드에서는 Context 클래스를 직접 사용하기보다는, Activity나 Service, Application 등에서 상속받은 하위 클래스를 사용하여 Context를 확장하고 사용하는 것이 일반적입니다. 이렇게 하면 각 컴포넌트의 실행 환경에 맞게 Context를 설정할 수 있습니다.


Context와 this의 차이

this 키워드는 현재 객체(Activity, Service 등)를 참조하는 참조변수입니다. 예를 들어, 액티비티 클래스에서 this는 액티비티 클래스의 인스턴스를 참조합니다. 

 

Toast.makeText()가 호출되는 위치가 Activity 등의 컴포넌트 내부이면, this를 사용하여 컴포넌트 자신을 Context로 전달할 수 있습니다. 예를 들어, MainActivity 클래스에서 Toast.makeText()를 호출할 때는 다음과 같습니다.

Toast.makeText(this, "Hello, world!", Toast.LENGTH_SHORT).show();

이 경우에 this는 MainActivity의 객체를 참조하며, MainActivity가 Context의 하위 클래스이므로 this를 전달하여 Context 객체를 제공할 수 있습니다.

 

Context는 애플리케이션의 실행환경에 대한 정보를 제공하는 인터페이스입니다. 따라서 this와 Context는 다르게 동작합니다. Activity나 Service와 같은 컴포넌트에서는 this를 사용하여 현재 객체를 참조할 수 있으며, 이를 통해 액티비티나 서비스의 기능을 수행합니다. 반면에, 리소스나 다른 컴포넌트를 사용하려면 Context를 사용해야 합니다. 또한, 액티비티나 서비스가 실행되는 동안에는 Context가 이미 생성되어 있으므로, this 대신에 Context를 사용하는 것이 안정적인 코드를 작성하는 데 도움이 됩니다.


결론

activity document

 

일반적으로 getApplicationContext를 사용하여 Toast.makeText를 하는 것이 컨텍스트를 제공하는 더 안전한 방법입니다.

 

this 키워드를 사용할 경우, 현재 Activity나 Service의 인스턴스를 Context로 전달하는 것이므로, 해당 Activity나 Service가 사라졌을 경우에 문제가 발생할 수 있습니다. 또는 Toast가 표시되는 동안 해당 Activity나 Service가 사라지면 Toast가 즉시 종료되지 않고 계속 표시되는 문제가 발생할 수 있습니다. 

 

반면에 getApplicationContext()를 사용하여 makeToast를 호출하면 현재 애플리케이션의 컨텍스트를 전달하므로 메모리 누수나 Toast가 계속 표시되는 문제를 방지할 수 있습니다.

 

따라서.Activity나 Service의 생명주기와 관련된 문제를 피하기 위해서 getApplicationContext를 사용하는 것을 권장합니다.

 

Toast.makeText()를 사용할 때, context를 달라고 하면 this를 입력하는 이유는 뭘까?에 대한 답으로 MainActivity가 Context의 하위 클래스이므로 this를 전달하여 Context 객체를 제공할 수 있기 때문이라는 결론을 찾을 수 있었습니다.

 


참고링크

https://developer.android.com/reference/android/content/Context

 

Context  |  Android Developers

 

developer.android.com

https://developer.android.com/reference/android/app/Activity

 

Activity  |  Android Developers

 

developer.android.com

https://developer.android.com/reference/android/widget/Toast

 

Toast  |  Android Developers

 

developer.android.com