๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Kotlin

์ดํŽ™ํ‹ฐ๋ธŒ ์ฝ”ํ‹€๋ฆฐ - 4์žฅ ์ถ”์ƒํ™” ์„ค๊ณ„

by ์ฃผ๋ฐœ2 2025. 7. 12.
๋ฐ˜์‘ํ˜•


์•„์ดํ…œ 26. ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์„ ํ†ต์ผํ•˜๋ผ

์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ์ถ”์ƒํ™”๋Š” ๋ณต์žกํ•œ ์ž๋ฃŒ, ๋ชจ๋“ˆ, ์‹œ์Šคํ…œ ๋“ฑ์œผ๋กœ๋ถ€ํ„ฐ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋… ๋˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ„์ถ”๋ ค๋‚ด๋Š” ๊ฒƒ

๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด, ์ถ”์ƒํ™”๋Š” ๋ณต์žก์„ฑ์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ์‹

 

์ฝ”๋“œ์—์„œ๋Š” ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๋„๊ตฌ๊ฐ€ ๋ฐ”๋กœ ํ•จ์ˆ˜์ด๋‹ค.

์ถ”์ƒํ™” ๋ ˆ๋ฒจ ํ†ต์ผ(Single Level of Abstraction, SLA) ์›์น™: ํ•จ์ˆ˜๋„ ๋†’์€ ๋ ˆ๋ฒจ๊ณผ ๋‚ฎ์€ ๋ ˆ๋ฒจ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉ

class CoffeeMachine {
    fun makeCoffee() {
        boilWater()  // ๋ฌผ์„ ๋“์ด๊ณ ,
        brewCoffee() // ์ปคํ”ผ๋ฅผ ๋‚ด๋ฆฌ๊ณ ,
        pourCoffee() // ์ปคํ”ผ๋ฅผ ๋ถ“๊ณ ,
        pourMilk()   // ์šฐ์œ ๋ฅผ ๋„ฃ๋Š”๋‹ค.
    }
	
    private fun boilWater() { ... }
    private fun brewCoffe() { ... }

}
  • makeCoffee ํ•จ์ˆ˜๋Š” ์ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๋ˆ„๊ตฐ๊ฐ€ ๋‚ฎ์€ ๋ ˆ๋ฒจ์˜ ํ•จ์ˆ˜(๋ฌผ ๋“์ด๊ธฐ, ์ปคํ”ผ ๋‚ด๋ฆฌ๊ธฐ, ์šฐ์œ  ๋„ฃ๊ธฐ ๋“ฑ)๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋งŒ ์‚ดํŽด๋ณด๋ฉด ๋œ๋‹ค.
  • ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ถ”์ƒํ™”๋ฅผ ์ถ”์ถœํ•ด์„œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ ๊ฒƒ
์‹ค์ œ๋กœ ์œ„์˜ ์ •๋„๋กœ๋งŒ ์ถ”์ƒํ™”๋ฅผ ์ ์šฉํ•˜์—ฌ๋„ ๊ฐ€๋…์„ฑ์ด ๊ต‰์žฅํžˆ ํ–ฅ์ƒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค.

์•„์ดํ…œ 27. ๋ณ€ํ™”๋กœ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

ํ•จ์ˆ˜์˜ ์ถ”์ƒํ™”

fun Context.toast(
    message: String,
    duration: Int = Toast.LENGTH_SHORT
) {
    Toast.makeText(this, message, duration).show()
}

context.toast(message)

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

 

fun Context.showMessage(
    message: String,
    duration: MessageLength = MessageLength.LONG // SHORT, LONG
) {
    val toastDuration = when(duration) {
        SHORT -> Toast.LENGTH_SHORT
        LONG -> Toast.LENGTH_LONG
    }
    
    Toast.makeText(this, message, toastDuration).show()
    
    // ๋ณ€๊ฒฝ ์‹œ 
    Snack.makeText(this, message, toastDuration).show()
}

์œ„์™€ ๊ฐ™์ด showMessage ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด?

 

ํ•จ์ˆ˜๊ฐ€ "๋ฌด์—‡"์„ ํ•˜๋Š”์ง€ What์— ์ง‘์ค‘ํ•˜๊ฒŒ ๋˜๊ณ , "์–ด๋–ป๊ฒŒ"์— How to๋Š” ์ˆจ๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€(ํด๋ผ์ด์–ธํŠธ)์—์„œ๋Š” ๊ฐœ๋…์„ ์•Œ ํ•„์š” ์—†์ด ๋‹จ์ˆœํžˆ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ํ† ์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์œ„์˜ showMessage() ํ•จ์ˆ˜๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

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

 

์ถ”์ƒํ™”์— ๋Œ€ํ•œ ๊ทœ์น™?

  • ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋Š” ์ดํ›„ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”์ƒํ™” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์˜์กด์„ฑ ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•  ๊ฒƒ
  • ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ ์‹œ ์ถ”์ƒํ™” ์ ์šฉ
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž‘๊ณ  ์‹คํ—˜์ ์ด๋ผ๋ฉด ์ถ”์ƒํ™”๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†์Œ

์•„์ดํ…œ 28. API ์•ˆ์ •์„ฑ์„ ํ™•์ธํ•˜๋ผ

@Experimental

 

@Deprecateed


 

์•„์ดํ…œ 30. ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋ผ

class CounterSet<T>(
    private val innerSet: MutableSet<T> = setOf()
) : MutableSet<T> by innerSet {
    val elementsAdded: Int = 0
        private set

    override fun add() ...
    override fun addAll() ...
}

์„ธํ„ฐ๋Š” private์œผ๋กœ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ธฐ์–ตํ•˜๋ผ.

 

ํ•œ ๋ฒˆ ๊ณต๊ฐœ๋œ API๋Š” ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ณ , ๋Œ€์ฒด์ œ์™€ ํ•˜์œ„ ํ˜ธํ™˜์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์™ธ๋ถ€ ๋…ธ์ถœ์€ ์‹ ์ค‘ํ•˜๊ฒŒ ์ •ํ•˜์ž.


์•„์ดํ…œ 31. ๋ฌธ์„œ๋กœ ๊ทœ์•ฝ์„ ์ •์˜ํ•˜๋ผ

ํŠนํžˆ๋‚˜ ์™ธ๋ถ€(๊ณต๊ฐœ) API๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ทœ์•ฝ์„ ์ž˜ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

/**
 * Returns a new read-only list of given elements.  The returned list is serializable (JVM).
 * @sample samples.collections.Collections.Lists.readOnlyList
 */
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()

 

...

EnableKafka ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ฃผ์„, ์ฃผ์„๋งŒ 200์ค„์ด ๋„˜๋Š”๋‹ค.

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€