
์์ดํ 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()

...

'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 6์ฅ ํด๋์ค ์ค๊ณ (0) | 2025.10.25 |
|---|---|
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 5์ฅ ๊ฐ์ฒด ์์ฑ (1) | 2025.08.15 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 3์ฅ ์ฌ์ฌ์ฉ์ฑ (0) | 2025.06.25 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ 2์ฅ - ๊ฐ๋ ์ฑ (2) | 2025.06.14 |
| ์ดํํฐ๋ธ ์ฝํ๋ฆฐ - 1์ฅ ์์ ์ฑ (2) | 2025.06.03 |
๋๊ธ