๐Ÿค” [Android]Context ๋„Œ ๋ˆ„๊ตฌ๋ƒ

yeonjeenยท2024๋…„ 1์›” 23์ผ
0

Android

๋ชฉ๋ก ๋ณด๊ธฐ
1/10
post-thumbnail

โ€˜contextโ€™์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” โ€˜๋ฌธ๋งฅ, ํ๋ฆ„โ€™์ด๋ผ๋Š” ๋œป์ด๋‹ค.

๊ทธ ๋œป์ฒ˜๋Ÿผ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฆ‰, ๊ฐ์ฒด์˜ ํ˜„์žฌ ํ๋ฆ„์„ ์ด์•ผ๊ธฐํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฌด์Šจ ์ผ์„ ํ•˜๋Š”๋ฐ?

context๋Š” ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ โ€˜ํ˜„์žฌ ์ƒํƒœโ€™๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • ์‹œ์Šคํ…œ์ด ๊ด€๋ฆฌํ•˜๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋‚˜, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” API(๋ฆฌ์†Œ์Šค, DB, Shared Preferences ๋“ฑ)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

โžก๏ธย  Activity,ย Applicationย ํด๋ž˜์Šค๋Š”ย Contextย ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋‹ค.

์ด๋Ÿฐ Context๋Š” 2๊ฐœ๋กœ ๋‚˜๋‰˜์–ด์ง„๋‹ค! Application Context์™€ Activity Context

Application Context

Activityย ์—์„œย ApplicationContextย ๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์ด๋‹ค.

๐ŸŽย ๋‚ด๊ฐ€ ๋ชฐ๋ผ์„œ ์ค€๋น„ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์‚ฌ์ „๐ŸŽ

[์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค]: ์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ํ˜ธ์ถœ๋˜๋”๋ผ๋„ ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์ด๊ณ  ์ตœ์ดˆ ์ƒ์„ฑ ์ดํ›„์— ํ˜ธ์ถœ๋œ ์ƒ์„ฑ์ž๋Š” ์ตœ์ดˆ์˜ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด
ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌํ•ด์•ผํ•˜๊ณ , ๊ทธ ๊ฐ์ฒด๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฌถ์—ฌ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œโ•ย Context๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜์„œ๋„ ํ•„์š”ํ•œ ์ž‘์—…์ด๋‚˜,

์•กํ‹ฐ๋น„ํ‹ฐ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ณณ์— Context๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์— ์ ํ•ฉํ•˜๋‹ค!

Activity Context

์œ„์— ApplicationContext์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์•Œ์ž˜๋”ฑ๊น”์„ผ์œผ๋กœ ActivityContext๋Š” ๋Œ€~์ถฉ ์ด๋Ÿฐ ๋‚ด์šฉ์ด๊ฒ ๋‹ค ์‹ถ์ฃ ?

(๋„ค. ์ œ๊ฐ€ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.)

ActivityContext๋Š” Activity์™€ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋ฌถ์—ฌ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Activity ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Activityย ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๋•Œ ๋„˜๊ฒจ์ค€๋‹ค
  • Activityย ์™€ย ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋„˜๊ฒจ์ค€๋‹ค.

โ†’ ์ฆ‰,ย Activityย ๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด ํ•ด๋‹นย Contextย ๋„ ๊ฐ™์ด ์†Œ๋ฉธ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿงน์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ

๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—๋Š” 2๊ฐœ์˜ Activity๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ Context์‚ฌ์šฉ์€ ์ด๋ ‡๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. ApplicationContext๋Š” 2๊ฐœ์˜ Activity ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. Activity1Context๋Š” MainActivity1์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. Activity2Context๋Š” MainActivity2์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์—ฌ๊ธฐ์„œ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค!

โ€œ๊ทธ๋ƒฅ ๋ชจ๋“  ๊ณณ์—์„œ ApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?โ€

โ€ผ๏ธย ์ž˜๋ชป๋œ Context ์‚ฌ์šฉ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉ ํ•  ๊ฒƒ โ€ผ๏ธ

๐ŸŽย ๋‚ด๊ฐ€ ๋ชฐ๋ผ์„œ ์ค€๋น„ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์‚ฌ์ „๐ŸŽ

[๋ฉ”๋ชจ๋ฆฌ ๋ฆญ]: ์•ฑ์€ ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ๋Œ์•„๊ฐ€๊ณ , ๊ทธ ๊ณต๊ฐ„์€ ํ•œ์ •๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด์„œ ์ œ๊ฑฐ๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์ค‘ ์ฐธ์กฐ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธฐ๊ณ , ๊ทธ๋ž˜์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์ œ๊ฑฐํ•ด์•ผ ๋˜๋Š” ๋Œ€์ƒ์œผ๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์™€ ๊ฐ™์ด ๊ฐ์ฒด์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„์˜ฌ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— โ€˜๋ฉ”๋ชจ๋ฆฌ ๋ฆญโ€™, โ€˜๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜โ€™๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Application ์€ ์•ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ๊ณ„์†ํ•˜์—ฌ ๋‚จ์•„์žˆ๋‹ค. ๋”ฐ๋ผ์„œ,ย Application Contextย ๋ฅผ ํ™œ์šฉํ•œ ๊ฐ์ฒด๋ฅผย ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œํ•˜์ง€ ์•Š๊ณ ย ์žˆ์„ ๊ฒฝ์šฐ,ย ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒ ํ•  ํ™•๋ฅ ์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.

๋ณธ๊ฒฉ์ ์œผ๋กœ Context ์ ‘๊ทผํ•˜๊ธฐ

binding.root.context

์˜ ์˜๋ฏธ๋Š” binding.root์— context ํ•œ๋‹ค๋Š” ๋œป์ด๊ฒ ์ฃ ?

binding.root๋Š” ํ•ด๋‹น ViewBinding์ด ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์˜ ์ตœ์ƒ์œ„ ๋ทฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

โ“class MyActivity : AppCompatActivity() {
    private lateinit var binding: MyActivityBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // ViewBinding ์ดˆ๊ธฐํ™”
        binding = MyActivityBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        // binding.root.context๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผ
        val currentContext = binding.root.context

        // currentContext๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—… ์ˆ˜ํ–‰
    }
}

binding.root.context๋ฅผ ํ†ตํ•ด ์ตœ์ƒ์œ„ ๋ทฐ์˜ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น UI ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์†ํ•œ ํ™œ๋™์ด๋‚˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • โ“๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ ‘๊ทผ์„ ํ•ด์„œ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒโ“
    • ๋ฆฌ์†Œ์Šค ์•ก์„ธ์Šค ex) ๋ฌธ์ž์—ด, ์ƒ‰์ƒ, ๊ทธ๋ฆผ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค

      val stringResource = binding.root.context.getString(R.string.my_string_resource)
      val colorResource = ContextCompat.getColor(binding.root.context, R.color.my_color_resource)
    • ์‹œ์Šคํ…œ ์„œ๋น„์Šค ์—‘์„ธ์Šค ex) ์•Œ๋ฆผ ์„œ๋น„์Šค, ํ‚ค๋ณด๋“œ ์„œ๋น„์Šค ๋“ฑ

      val notificationManager = binding.root.context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    • ํ† ์ŠคํŠธ ๋ฉ”์„ธ์ง€ ํ‘œ์‹œ

      Toast.makeText(binding.root.context, "Hello, World!", Toast.LENGTH_SHORT).show()
    • ์—‘ํ‹ฐ๋น„ํ‹ฐ ์ „ํ™˜

      val intent = Intent(binding.root.context, AnotherActivity::class.java)
      binding.root.context.startActivity(intent)
    • ํ…Œ๋งˆ ๋ฐ ์Šคํƒ€์ผ ์ ์šฉ

      val themedContext = ContextThemeWrapper(binding.root.context, R.style.MyCustomTheme)

โ†’ ์ด ์ž‘์—…๋“ค์€ ์•กํ‹ฐ๋น„ํ‹ฐ ์•ˆ์—์„œ ์ด๋ค„์ง€๋Š” ๊ฒƒ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ActivityContext์— ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค.

Context ๋ฉ”์„œ๋“œ

๊ทธ๋Ÿผ context์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์— ์•Œ์•„๋ณด์ž.

  • getApplicationContext()
  • getApplication()
  • getBaseContext()
  • getContext()
  • getContext()
  • requireContext()

context ์‚ฌ์šฉ์— ์–ด๋ ค์šด ์ ์€ ๋ฉ”์„œ๋“œ๋“ค ๊ฐ„ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€, ์–ด๋””์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ์ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋“ค์ด ์–ด๋–ค ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ณด๋ฉด ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค

  • ContextWrapper.getApplicationContext()
  • Activity.getApplication()
  • Service.getApplication()
  • ContextWrapper.getBaseContext()
  • View.getContext()
  • Fragment.getContext()
  • Fragment.requireContext()

์ด๊ฑธ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ Context ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

  1. Context : Contextํด๋ž˜์Šค์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋ฉฐ, ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๊ฑฐ์˜ ์—†๊ณ , ์ƒ์ˆ˜ ์ •์˜๋“ค๊ณผ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ํด๋ž˜์Šค์ด๋‹ค.
public abstract class Context
  1. Contextlmpl : ์ƒ์œ„ ํด๋ž˜์Šค์ธ Context์— ๊ตฌํ˜„์ด ์ด๋ฃจ์–ด์ง€๋Š” ํด๋ž˜์Šค์ด๊ณ , Context๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ๋‹ค.

โ†’ ํ•˜์ง€๋งŒ Application, Activity, Service๊ฐ€ Contextlmpl์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  1. ContextWrapper : Contextlmpl์„ ๋žฉํ•‘ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

๐ŸŽย ๋‚ด๊ฐ€ ๋ชฐ๋ผ์„œ ์ค€๋น„ํ•œ ์•ˆ๋“œ๋กœ์ด๋“œ ์‚ฌ์ „๐ŸŽ

[๋žฉํ•‘]: ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋‚˜ ๊ธฐ๋Šฅ์„ ๋” ๊ฐ์‹ธ๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ or ๋ณ€๊ฒฝํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋œปํ•œ๋‹ค. (๋žฉํ•‘์˜ ๊ฐœ๋…์ด ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Context์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ Not Bad~)

import android.content.Context
import android.content.ContextWrapper
import android.content.SharedPreferences

class MyContextWrapper(base: Context) : ContextWrapper(base) {

    companion object {
        private const val PREFERENCES_NAME = "MyPreferences"
        private const val KEY_USERNAME = "username"
    }

    // ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
    fun saveUsername(username: String) {
        val sharedPreferences = getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)
        val editor = sharedPreferences.edit()
        editor.putString(KEY_USERNAME, username)
        editor.apply()
    }

    // ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฉ”์„œ๋“œ
    fun loadUsername(): String? {
        val sharedPreferences = getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE)
        return sharedPreferences.getString(KEY_USERNAME, null)
    }
}

์œ„์˜ ์ฝ”๋“œ์—์„œ ContextWrapper ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด base๋ผ๋Š” Context๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค.

์ด base๊ฐ€ Context ๊ตฌํ˜„์— ํ•ด๋‹นํ•œ๋‹ค.

MyContextWrapper๋Š” base์— ์ „๋‹ฌ๋œ Context๋ฅผ ๊ฐ์‹ธ๊ณ , ๊ทธ ์œ„์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, MyContextWrapper ํด๋ž˜์Šค๋Š” ๊ธฐ์กด Context์˜ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋žฉํ•‘ํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํŠน์ • ๋™์ž‘์„ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Application, Service, Activity : ContextWrapper์„ ์ƒ์†๋ฐ›์•„ ์šฐ๋ฆฌ๊ฐ€ Context๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ Context์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ  ๋‹ค์‹œ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ด๋ณด์ž.

  • ContextWrapper.getApplicationContext()

    ContextWrapper์˜ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ์‹ฑ๊ธ€ํ†ค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด์˜ context๋ฅผ ๋ฆฌํ„ด

  • Activity.getApplication()

    Activity์˜ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, Activity๋ฅผ ์†Œ์œ ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด

  • Service.getApplication()

    Service์˜ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, Service๋ฅผ ์†Œ์œ ํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด

  • ContextWrapper.getBaseContext()

    ContextWrapper์˜ ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ์ƒ์„ฑ์ž ๋˜๋Š” setBaseContext()๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๋œ base context ๋ฆฌํ„ด

    (์•„๊นŒ ContextWrapper ํด๋ž˜์Šค๋ฅผ ์•Œ์•„๋ณด๋ฉด์„œ ๋ดค๋˜ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค!)

  • View.getContext()

    View๊ฐ€ ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฆฌํ„ด

  • Fragment.getContext()

    Fragment๊ฐ€ ์—ฐ๊ฒฐ๋œ ActivityContext๋ฅผ ๋ฆฌํ„ด(Nullable)

  • Fragment.requireContext()

    Fragment๊ฐ€ ์—ฐ๊ฒฐ๋œ ActivityContext๋ฅผ ๋ฆฌํ„ด(NonNull)

๐Ÿ’ก ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ์„œ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋Š” context๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์ปจํ…์ŠคํŠธ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ ์ ˆํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ธธ๋Ÿฌ์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ฝ”๋“œ ํ•œ ์ค„์„ ์“ฐ๋Š” ๊ฒƒ์— ์žˆ์–ด์„œ ๊ฐœ๋ฐœ์ž์˜ ํŒ๋‹จ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•ฑ์žผ์„ ํ•˜๋ฉด์„œ ๋А๋ผ๊ฒŒ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ์ฝ”๋“œ ํ•œ ์ค„์— ํ™•์‹ ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ˜Š

0๊ฐœ์˜ ๋Œ“๊ธ€