[Kotlin] Object vs Companion object

Minji Jeongยท2022๋…„ 4์›” 23์ผ
1

Android

๋ชฉ๋ก ๋ณด๊ธฐ
3/39
post-thumbnail

๐Ÿ™„ ๊ฐ™์€ object ๊ฐ™๊ธด ํ•œ๋ฐ ๋ญ๊ฐ€ ๋‹ค๋ฅธ์ง€ ?

์ฝ”ํ‹€๋ฆฐ์„ ๋ฐฐ์šด์ง€ ์–ผ๋งˆ ์•ˆ๋˜์—ˆ์„ ๋•Œ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์™€ ๋‹ค๋ฅด๊ฒŒ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Object declaration ๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•ด์•ผ ํ•  ๊ฒฝ์šฐ(ex ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Retrofit ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์™€ ๊ฐ™์€), ํด๋ž˜์Šค๋ช… ์•ž์— Object ํ‚ค์›Œ๋“œ๋ฅผ ์จ์„œ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ๋‹ค.
+ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋‹ˆ Singleton pattern์— ๋Œ€ํ•ด์„œ๋„ ๋‚˜์ค‘์— ๋”ฐ๋กœ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.
+ ์ฐธ๊ณ ๋กœ ์ด ๊ธ€์—์„œ ๋งํ•˜๋Š” object declaration์€ object expression๊ณผ ๋‹ค๋ฅด๋‹ค! object expression์€ ์•„์ง ์จ๋ณธ์ ์ด ์—†์–ด์„œ, ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๋‚˜์ค‘์— ๋”ฐ๋กœ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์–ด๋Š ๋‚ , ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ž‘๊ฒŒ ์„ ์–ธ๋œ [companion object] ๋ฅผ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„๋ž˜์˜ ํ˜•์‹์œผ๋กœ ๋ง์ด๋‹ค.


override fun onCreate(savedInstanceState: Bundle?){
	super.onCreate(savedInstanceState)
   	...
   	Log.i(TAG, "MainActivity")
}

companion object {
	private const val TAG="MainActivity"
}

Object declaration๊ณผ ๋น„์Šทํ•˜๊ธด ํ•œ ๊ฒƒ ๊ฐ™๊ธด ํ•œ๋ฐ, ์•ž์— companion์ด ๋ถ™์—ˆ๋‹ค. ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ?

๋จผ์ €, ์œ„์—์„œ ์„ค๋ช…ํ•˜๊ธด ํ–ˆ์ง€๋งŒ Object declaration์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž.

โœ… Object declaration?

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”ํ‹€๋ฆฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์˜ ๊ฐ์ฒด ์„ ์–ธ ํ‚ค์›Œ๋“œ๋‹ค.

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ...
    }

    val allDataProviders: Collection<DataProvider>
        get() = // ...
}

Object ์„ ์–ธ์—” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋‹ค.

  • thread safe
    Object ํ‚ค์›Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” thread safeํ•ฉ๋‹ˆ๋‹ค.
    thread safe โ“
    ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ํ˜น์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ
  • lazy initialization
    Object ํ‚ค์›Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€์—์„œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Object ํ‚ค์›Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” ์ฃผ/๋ถ€ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์—†์ด ๋ฐ”๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ์ค‘์ฒฉ object ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… companion object

ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๊ฐ์ฒด ์„ ์–ธ์„ ์œ„ํ•œ object ํ‚ค์›Œ๋“œ๋‹ค. ํ•œ ๋งˆ๋””๋กœ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

companion object์˜ ๋ฉค๋ฒ„๋“ค์€ ์ƒ์„ฑ์ž ์—†์ด companion object ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

val instance = MyClass.create()

companion object๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์—†์ด ์–ด๋–ค ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์„ ์–ธํ•œ๋‹ค. ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , Object declaration๊ณผ ๊ฐ™์ด ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ, static์œผ๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์‹œ ์‹ค์ œ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋กœ ์‹คํ–‰๋œ๋‹ค.

๐ŸŸก Object declaration vs companion object

๋‘ ์„ ์–ธ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์€ ์•ž์„œ ๊ฐœ๋…๋งŒ ๋ด๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Object declaration์€ ํด๋ž˜์Šค ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ์„ ์–ธ๋˜์ง€๋งŒ, companion object๋Š” ํด๋ž˜์Šค ๋‚ด์— ์ผ๋ถ€๋ถ„์ด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ์„ ์–ธ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ๋‘˜์€ ์ดˆ๊ธฐํ™” ์‹œ์ ์ด ๋‹ค๋ฅด๋‹ค. Object declaration์ด ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€๋งŒ, companion object๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์†ํ•œ ํด๋ž˜์Šค๊ฐ€ load๋  ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

References

https://kotlinlang.org/docs/object-declarations.html#object-declarations-overview
https://umbum.dev/597
https://velog.io/@ditt/Kotlin-Object-%ED%82%A4%EC%9B%8C%EB%93%9C

profile
Mobile Software Engineer

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