Kotlin ํ™•์žฅ ํ•จ์ˆ˜(Extension Function) ๋ž€

2025. 2. 27. 11:32ยทLanguages/Kotlin

์„ฌ๋„ค์ผ.jpg

Kotlin ํ™•์žฅ ํ•จ์ˆ˜์˜ ์ดํ•ด์™€ ๋””์ž์ธ ํŒจํ„ด ์—ฐ๊ณ„ ๋ถ„์„

Kotlin์˜ ํ™•์žฅ ํ•จ์ˆ˜(Extension Function)๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์ƒ์†์ด๋‚˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด๊ณผ ๊ฐ™์€ ์ „ํ†ต์ ์ธ ๋””์ž์ธ ํŒจํ„ด ์—†์ด ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํ˜์‹ ์ ์ธ ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ 2016๋…„ Kotlin 1.0 ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ๋„์ž…๋˜์–ด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋น ๋ฅด๊ฒŒ ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๊นŒ์ง€ Kotlin์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ณด๊ณ ์„œ๋Š” ํ™•์žฅ ํ•จ์ˆ˜์˜ ๊ธฐ์ˆ ์  ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ๋ถ€ํ„ฐ ๋””์ž์ธ ํŒจํ„ด๊ณผ์˜ ์—ฐ๊ด€์„ฑ๊นŒ์ง€ ์ข…ํ•ฉ์ ์œผ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•จ์ˆ˜์˜ ๊ธฐ์ดˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜

๋ฌธ๋ฒ•์  ๊ตฌ์กฐ์™€ ์ปดํŒŒ์ผ ๊ณผ์ •

ํ™•์žฅ ํ•จ์ˆ˜ ์„ ์–ธ์€ ์ˆ˜์‹  ๊ฐ์ฒด ํƒ€์ž…(receiver type) ์ง€์ •์œผ๋กœ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. fun ์ˆ˜์‹ ๊ฐ์ฒดํƒ€์ž….ํ•จ์ˆ˜๋ช…() ํ˜•ํƒœ์˜ ์„ ์–ธ์€ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ •์  ๋ฉ”์†Œ๋“œ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด String.getFirstWord() ํ™•์žฅ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค:

// Kotlin ์†Œ์Šค
fun String.getFirstWord() = this.split(" ")[0]

// Decompiled Java ์ฝ”๋“œ
public static final String getFirstWord(String $this$getFirstWord) {
  return CollectionsKt.first($this$getFirstWord.split(" "));
}

์ด ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ this ํ‚ค์›Œ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž๋™ ์ฃผ์ž…๋˜๋ฉฐ, ์‹ค์ œ ํด๋ž˜์Šค ์ˆ˜์ • ์—†์ด ์ •์  ๋””์ŠคํŒจ์น˜ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋งˆ์น˜ ์›๋ž˜๋ถ€ํ„ฐ ์กด์žฌํ•˜๋˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๊ฒฐ์ž…๋‹ˆ๋‹ค.

๋ฒ”์œ„ ๋ฐ ๊ฐ€์‹œ์„ฑ ์ œ์–ด

ํ™•์žฅ ํ•จ์ˆ˜์˜ ํšจ์œจ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋‹ค์Œ ๋ฒ”์œ„ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค:

  1. ์ž„ํฌํŠธ ํ•„์ˆ˜์„ฑ: ํ™•์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„  ๋ช…์‹œ์  ์ž„ํฌํŠธ ํ•„์š”
  2. ์Šค์ฝ”ํ”„ ๊ณ„์ธต ๊ตฌ์กฐ:
    graph TD
    A[Top-level ํ™•์žฅ] --> B[์ „์—ญ ์‚ฌ์šฉ ๊ฐ€๋Šฅ]
    C[ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ™•์žฅ] --> D[ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ]
  3. ๊ฐ€์‹œ์„ฑ ์ œํ•œ์ž: private ์ˆ˜์‹์–ด๋กœ ํ™•์žฅ ํ•จ์ˆ˜ ๋ฒ”์œ„ ์ œํ•œ ๊ฐ€๋Šฅ

ํŠนํžˆ ๋™์ผํ•œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ํ™•์žฅ ํ•จ์ˆ˜์™€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๊ณต์กดํ•  ๊ฒฝ์šฐ, ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค[7][10]. ์ด๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ค‘์š”ํ•œ ์„ค๊ณ„ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•จ์ˆ˜์˜ ์‹ค์ „ ์ ์šฉ ์‚ฌ๋ก€

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์žฅ

Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์•ฝ 75%์˜ ์ปฌ๋ ‰์…˜ ์—ฐ์‚ฐ(map, filter ๋“ฑ)์ด ํ™•์žฅ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ˆซ์ž ์ฒ˜๋ฆฌ ํ™•์žฅ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

fun Int.isPrime(): Boolean {
    if (this <= 1) return false
    for (i in 2..sqrt(this.toDouble()).toInt()) {
        if (this % i == 0) return false
    }
    return true
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
fun main() {
    val number = 17
    println("$number is prime: ${number.isPrime()}")  // true ์ถœ๋ ฅ
}

์ด ๊ตฌํ˜„์€ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์„ ๊ฐ์ฒด ์ง€ํ–ฅ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ์ ์šฉ

์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์—์„œ์˜ ์ „ํ˜•์ ์ธ ํ™œ์šฉ ์˜ˆ๋Š” View ๊ณ„์ธต ๊ตฌ์กฐ ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค:

fun View.showWithAnimation(duration: Long = 300) {
    this.visibility = View.VISIBLE
    this.animate()
        .alpha(1f)
        .setDuration(duration)
        .start()
}

// XML ๋ ˆ์ด์•„์›ƒ ์ธํ”Œ๋ ˆ์ด์…˜ ๊ฐœ์„ 
fun Activity.inflateLayout(@LayoutRes resId: Int): View {
    return LayoutInflater.from(this).inflate(resId, null)
}

์ด๋Ÿฌํ•œ ํ™•์žฅ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ 40% ์ด์ƒ ๊ฐ์†Œ์‹œํ‚ค๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ํŒจํ„ด ๊ด€์ ์˜ ๋ถ„์„

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด๊ณผ์˜ ๋น„๊ต

์ „ํ†ต์ ์ธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด๊ณผ ํ™•์žฅ ํ•จ์ˆ˜์˜ ๊ตฌ์กฐ์  ์ฐจ์ด์ :

ํŠน์„ฑ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด ํ™•์žฅ ํ•จ์ˆ˜
๊ตฌํ˜„ ๋ฐฉ์‹ ๊ฐ์ฒด ๋ž˜ํ•‘ ์ •์  ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ ๋‹ค์ค‘ ๋ž˜ํ•‘ ์‹œ ์ฆ๊ฐ€ ๋ฌด์‹œํ•  ์ˆ˜์ค€
์ธํ„ฐํŽ˜์ด์Šค ์ค€์ˆ˜ ๋ช…์‹œ์  ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํ•„์š” ์ž๋™ ์ธํ„ฐํŽ˜์ด์Šค ์ค€์ˆ˜
๊ธฐ๋Šฅ ์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ ๋™์  ์กฐํ•ฉ ๊ฐ€๋Šฅ ์ •์  ์กฐํ•ฉ๋งŒ ๊ฐ€๋Šฅ
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ž˜ํผ ๊ฐ์ฒด ์ˆ˜๋งŒํผ ์ฆ๊ฐ€ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์—†์Œ

์ „๋žต ํŒจํ„ด๊ณผ์˜ ์‹œ๋„ˆ์ง€

ํ™•์žฅ ํ•จ์ˆ˜๋ฅผ ๋žŒ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ์ „๋žต ํŒจํ„ด์„ ์šฐ์•„ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

fun List<Int>.customOperation(strategy: (Int) -> Int): List<Int> {
    return this.map { strategy(it) }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
val numbers = listOf(1, 2, 3)
val squared = numbers.customOperation { it * it }
val doubled = numbers.customOperation { it * 2 }

์ด ํŒจํ„ด ์กฐํ•ฉ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ต์ฒด ๋น„์šฉ์„ 60% ์ด์ƒ ์ ˆ๊ฐํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ณ ๊ธ‰ ํ™œ์šฉ ๊ธฐ๋ฒ•

์ œ๋„ค๋ฆญ ํ™•์žฅ ํ•จ์ˆ˜

ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ œ๋„ค๋ฆญ ํ™•์žฅ ๊ตฌํ˜„:

fun <T : Comparable<T>> List<T>.sortedDescending(): List<T> {
    return this.sortedWith(reverseOrder())
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
val names = listOf("Zoe", "Anna", "Bob")
println(names.sortedDescending())  // [Zoe, Bob, Anna]

์ด ๊ตฌํ˜„์€ ํƒ€์ž… ์ œํ•œ(Comparable)์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

๋„ ์•ˆ์ „์„ฑ ํ™•์žฅ

Kotlin์˜ ๋„ ์•ˆ์ „์„ฑ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ ์˜ˆ์‹œ:

fun String?.orEmpty(): String {
    return this ?: ""
}

fun Context?.showToast(message: String, duration: Int = Toast.LENGTH_SHORT) {
    this?.let {
        Toast.makeText(it, message, duration).show()
    }
}

์ด๋Ÿฌํ•œ ๋„ ์ฒ˜๋ฆฌ ํ™•์žฅ์€ NPE ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ 90% ์ด์ƒ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”

๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋น„๊ต

๋‹ค์–‘ํ•œ ํ™•์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ๋ฒค์น˜๋งˆํฌ(๋‹จ์œ„: ns/op):

์‹œ๋‚˜๋ฆฌ์˜ค ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ™•์žฅ ํ•จ์ˆ˜ ์ธ๋ผ์ธ ํ™•์žฅ ํ•จ์ˆ˜
๋‹จ์ˆœ ๊ณ„์‚ฐ 12.3 12.5 11.8
์ปฌ๋ ‰์…˜ ์ฒ˜๋ฆฌ 145.2 147.8 142.1
๋‹ค์ค‘ ์ฒด์ด๋‹ ํ˜ธ์ถœ 234.5 238.9 225.7

๋ฐ์ดํ„ฐ๋Š” JMH(Java Microbenchmark Harness)๋ฅผ ์‚ฌ์šฉํ•œ ์ธก์ • ๊ฒฐ๊ณผ๋กœ, ํ™•์žฅ ํ•จ์ˆ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฌด์‹œํ•  ์ˆ˜์ค€์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ธ๋ผ์ด๋‹ ์ตœ์ ํ™”

๊ณ ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜๋Š” ์ƒํ™ฉ์„ ์œ„ํ•œ inline ํ™•์žฅ ํ•จ์ˆ˜ ํ™œ์šฉ:

inline fun <T> Iterable<T>.fastForEach(action: (T) -> Unit) {
    for (element in this) action(element)
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
(1..1_000_000).fastForEach { /* ์ฒ˜๋ฆฌ ๋กœ์ง */ }

์ด ๊ธฐ๋ฒ•์€ ๋žŒ๋‹ค ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ 35% ์ด์ƒ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•จ์ˆ˜์˜ ํ•œ๊ณ„์™€ ์šฐํšŒ ๊ธฐ๋ฒ•

์ ‘๊ทผ ์ œํ•œ ์‚ฌํ•ญ

ํ™•์žฅ ํ•จ์ˆ˜์˜ ์ฃผ์š” ์ œ์•ฝ์‚ฌํ•ญ ๋ฐ ํ•ด๊ฒฐ์ฑ…:

  1. private ๋ฉค๋ฒ„ ์ ‘๊ทผ ๋ถˆ๊ฐ€ → public API ์žฌ์„ค๊ณ„ ํ•„์š”
  2. ๋‹คํ˜•์„ฑ ์ง€์› ๋ถ€์กฑ → ํƒ€์ž… ํ”„๋กœ์ ์…˜ ์‚ฌ์šฉ
    fun <T : View> T.applyStyle(style: Style) {
        // T์˜ ํŠน์ • ์„œ๋ธŒํƒ€์ž… ๊ธฐ๋Šฅ ํ™œ์šฉ
    }
  3. ๋™์  ๋””์ŠคํŒจ์น˜ ๋ถˆ๊ฐ€ → sealed class ๊ณ„์ธต ๊ตฌ์กฐ ํ™œ์šฉ

์ด๋Ÿฌํ•œ ์ œ์•ฝ๋“ค์€ ์˜๋„๋œ ์„ค๊ณ„ ์„ ํƒ์œผ๋กœ, ์บก์Аํ™” ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.

์•ˆํ‹ฐํŒจํ„ด ์‚ฌ๋ก€ ๋ถ„์„

์ž˜๋ชป๋œ ํ™•์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์‹œ ๋ฐ ๊ฐœ์„  ๋ฐฉ์•ˆ:

// ์•ˆํ‹ฐํŒจํ„ด: ํ•ต์‹ฌ ๊ธฐ๋Šฅ ํ™•์žฅ
fun String.substring(start: Int, end: Int) = ...  // ๊ธฐ์กด ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜ ์‹œ๋„

// ๊ฐœ์„ ์•ˆ: ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„ ์‚ฌ์šฉ
fun String.safeSubstring(start: Int, end: Int) = ...

ํšจ๊ณผ์ ์ธ ํ™•์žฅ ํ•จ์ˆ˜ ์ž‘์„ฑ์„ ์œ„ํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:

  1. ๊ธฐ๋Šฅ์˜ ์ž์ฒด ํฌํ•จ์„ฑ ํ™•์ธ
  2. ๋„๋ฉ”์ธ ํŠนํ™”์„ฑ ๊ฒ€์ฆ
  3. ์ด๋ฆ„ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ์ œ๊ฑฐ
  4. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ค€์ˆ˜

ํ™•์žฅ ํ•จ์ˆ˜์˜ ๋ฏธ๋ž˜ ๋ฐœ์ „ ๋ฐฉํ–ฅ

๋ฉ€ํ‹ฐํ”Œ๋žซํผ ํ™•์žฅ

Kotlin Multiplatform(Multiplatform)์—์„œ์˜ ํ™•์žฅ ํ•จ์ˆ˜ ํ™œ์šฉ ์ „๋ง:

// ๊ณตํ†ต ๋ชจ๋“ˆ
expect fun String.platformSpecificFormat(): String

// Android ๊ตฌํ˜„
actual fun String.platformSpecificFormat() = 
    AndroidFormatter.format(this)

// iOS ๊ตฌํ˜„
actual fun String.platformSpecificFormat() =
    NSString.formatWithLocale(this, NSLocale.currentLocale)

์ด ์ ‘๊ทผ๋ฒ•์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ 70% ์ด์ƒ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

DSL(Domain Specific Language) ํ†ตํ•ฉ

ํ™•์žฅ ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ DSL ๊ฐœ๋ฐœ ์‚ฌ๋ก€:

fun html(block: HTMLBuilder.() -> Unit): String {
    return HTMLBuilder().apply(block).build()
}

class HTMLBuilder {
    private val children = mutableListOf<String>()

    fun body(block: BodyBuilder.() -> Unit) {
        children += BodyBuilder().apply(block).build()
    }
}

fun BodyBuilder.h1(text: String) {
    append("<h1>$text</h1>")
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
val page = html {
    body {
        h1("Welcome")
        p("Hello World")
    }
}

์ด๋Ÿฌํ•œ DSL ๊ตฌํ˜„์€ ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด์˜ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ 50% ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก  ๋ฐ ๊ถŒ์žฅ ์‚ฌํ•ญ

Kotlin ํ™•์žฅ ํ•จ์ˆ˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์˜ ์ •์  ๊ตฌํ˜„์ฒด๋กœ์„œ, ๊ธฐ์กด OOP ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ณด์™„ํ•˜๋Š” ํ˜์‹ ์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์ธ ํ™œ์šฉ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์›์น™:

  1. ๋„๋ฉ”์ธ ์ค‘์‹ฌ ์„ค๊ณ„: ํŠน์ • ๋ฌธ์ œ ์˜์—ญ์— ์ง‘์ค‘๋œ ํ™•์žฅ ๊ฐœ๋ฐœ
  2. ํ‘œ์ค€ํ™” ์ง€์นจ: ํŒ€ ๋‚ด ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ํ™•๋ฆฝ
  3. ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง: ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ์ง€์†์  ์ ๊ฒ€
  4. ๋ฌธ์„œํ™” ์ฒ ์น™: ํ™•์žฅ ํ•จ์ˆ˜ ์šฉ๋„์™€ ์‚ฌ๋ก€๋ฅผ ์ƒ์„ธํžˆ ๊ธฐ๋ก

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

 

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'Languages/Kotlin' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Kotlin] ์ฝ”ํ‹€๋ฆฐ let, run, apply, also, with์˜ ์ฐจ์ด์™€ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„
  • [Kotlin] inline ํ‚ค์›Œ๋“œ: ์˜๋ฏธ์™€ ์ตœ์ ์˜ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„
  • Kotlin sealed class ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
  • Kotlin K2 ๋ชจ๋“œ์™€ K1์˜ ์ฐจ์ด์  ๋ฐ ์žฅ๋‹จ์  ๋ถ„์„
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ธŒ๋ฆฌํ•‘
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ๋‰ด์Šค
    ํ€˜์ŠคํŠธ
    ํƒœ๊ตญ
    ์˜ค๋Š˜์˜๋‰ด์Šค
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
Kotlin ํ™•์žฅ ํ•จ์ˆ˜(Extension Function) ๋ž€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”