[Android] ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด ๊ฐœ๋… ๋ฐ ์˜ˆ์‹œ, object, companion object
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

 

๐Ÿค” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด?

 

์ถœ์ฒ˜: Medium (https://medium.com/@Prachi-Jamdade/singleton-design-pattern-in-android-explained-5c46f6cd3448)

 

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ์ด ํŒจํ„ด์€ ํŠน์ • ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋ฅผ ์˜ค์ง ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค.
    ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•ˆ๋“œ๋กœ์ด๋“œ๋‚˜ Kotlin์—์„œ์˜ "๊ฐ์ฒดํ™”"๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜์—ฌ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด ๋•Œ, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ์˜ค์ง ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๋ฉฐ, ์ดํ›„์—๋Š” ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 


 

๐Ÿ–ฅ๏ธ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„๊ณผ ์‹ฑ๊ธ€ํ†ค์˜ ์ฐจ์ด

 

์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„ O

object Singleton {
    init {
        println("Singleton instance created")
    }
    
    fun doSomething() {
        println("Singleton is doing something")
    }
}

fun main() {
    // Singleton ๊ฐ์ฒด์— ์ ‘๊ทผ
    Singleton.doSomething()
    Singleton.doSomething()
}

// Singleton instance created
// Singleton is doing something
// Singleton is doing something
  • ์ด ์ฝ”๋“œ์—์„œ๋Š” Singleton ํด๋ž˜์Šค๊ฐ€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ •์˜๋˜์–ด์žˆ๋‹ค.
  • Singleton ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” object ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜์—ˆ๋‹ค.
  • main ํ•จ์ˆ˜์—์„œ Singleton.doSomething()์„ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, "Singleton instance created"๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋˜๊ณ , "Singleton is doing something"์€ ๋‘ ๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋Š” Singleton ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„ X

class NormalClass {
    init {
        println("NormalClass instance created")
    }
    
    fun doSomething() {
        println("NormalClass is doing something")
    }
}

fun main() {
    // ๋‘ ๋ฒˆ์˜ ๊ฐ์ฒด ์ƒ์„ฑ
    val instance1 = NormalClass()
    val instance2 = NormalClass()
    
    instance1.doSomething()
    instance2.doSomething()
}

// NormalClass instance created
// NormalClass instance created
// NormalClass is doing something
// NormalClass is doing something
  • ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
  • ์ด ์ฝ”๋“œ์—์„œ๋Š” NormalClass๋ผ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ ,
    main ํ•จ์ˆ˜์—์„œ ๋‘ ๋ฒˆ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ๊ฐ์˜ doSomething() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด "NormalClass instance created"๊ฐ€ ๋‘ ๋ฒˆ ์ถœ๋ ฅ๋˜๊ณ ,
    "NormalClass is doing something"๋„ ๋‘ ๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค.
  • ์ด๋Š” NormalClass์˜ ๊ฐ์ฒด๊ฐ€ ๋‘ ๋ฒˆ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๋‘ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด๊ณผ ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

๐Ÿค” object? 

์ฝ”ํ‹€๋ฆฐ์—์„œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํ‚ค์›Œ๋“œ๋Š” class์ด์ง€๋งŒ, ๊ฐ„ํ˜น object ํ‚ค์›Œ๋“œ๋กœ ํด๋ž˜์Šค ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. object๋กœ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด, ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด์ด ์ ์šฉ๋˜์–ด ๊ฐ์ฒด๊ฐ€ ํ•œ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฝค ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” object๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ํ˜•์‹์ ์ธ ์ฝ”๋“œ(boilerplate)๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์™ธ์—๋„, object๋Š” ์ต๋ช…๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์‚ฌ์šฉ๋œ๋‹ค.

 

object๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ์‹ฑ๊ธ€ํ„ด ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ๋•Œ
  • ์ต๋ช… ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ

 

ํŠน์ง•

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

 

 


 

 

๐Ÿค” companion object?

class MyClass {
    companion object {
        fun companionMethod() {
            println("Companion method")
        }
    }

    object Singleton {
        fun singletonMethod() {
            println("Singleton method")
        }
    }
}

fun main() {
    MyClass.companionMethod() // companion method ํ˜ธ์ถœ, ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์—†์ด ํ˜ธ์ถœ
    MyClass.Singleton.singletonMethod() // singleton method ํ˜ธ์ถœ
}

// companion object์—๋Š” ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ์ •์  ๋ฉค๋ฒ„์ธ companionMethod()๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ณ ,
// object์—๋Š” ํด๋ž˜์Šค์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์ธ Singleton์ด ์ •์˜๋˜์–ด ์žˆ์Œ

 

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

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

์–ด๋Š ๋ฐฉ๋ฒ•์„ ์„ ํƒํ• ์ง€๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ object๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด๋‹ค. ํ•˜์ง€๋งŒ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋•Œ๋Š” companion object๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ฐจ์ด์  ์ •๋ฆฌ

object:

  • object๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด์„œ ๋™์‹œ์— ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•œ๋‹ค.
  • object ๋‚ด๋ถ€์—๋Š” ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ, ์ดˆ๊ธฐํ™” ๋ธ”๋ก ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์ „์—ญ์ ์ธ ๊ณต๊ฐ„์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

companion object:

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

 

์ •๋ฆฌํ•˜์ž๋ฉด object๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, companion object๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๊ด€๋ จ๋œ ์ •์  ๋ฉค๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. object๋Š” ์ „์—ญ์ ์ธ ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , companion object๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์ •์  ๋ฉค๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T