[Kotlin] ์ฝ”ํ‹€๋ฆฐ let, run, apply, also, with์˜ ์ฐจ์ด์™€ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„

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

์„ฌ๋„ค์ผ.jpg

์ฝ”ํ‹€๋ฆฐ let, run, apply, also, with์˜ ์ฐจ์ด์™€ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„

์ฝ”ํ‹€๋ฆฐ์˜ ๋ฒ”์œ„ ์ง€์ • ํ•จ์ˆ˜(Scope Functions)๋Š” ๊ฐ์ฒด ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ฝ”๋“œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ๋„๊ตฌ๋กœ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๊ฐ„๊ฒฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. let, run, apply, also, with์˜ ๋‹ค์„ฏ ๊ฐ€์ง€ ํ•จ์ˆ˜๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋“ค์˜ ์ฐจ์ด์ ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ ์ฝ”๋”ฉ์„ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ง€์ • ํ•จ์ˆ˜์˜ ํ•ต์‹ฌ ์ฐจ์ด์ 

์ปจํ…์ŠคํŠธ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์‹

  • it ์‚ฌ์šฉ: let, also → ๋ช…์‹œ์  ์ฐธ์กฐ๋กœ ์™ธ๋ถ€ ๋ณ€์ˆ˜์™€์˜ ์ถฉ๋Œ ๋ฐฉ์ง€
  • this ์‚ฌ์šฉ: run, apply, with → ์•”์‹œ์  ์ฐธ์กฐ๋กœ ์ฝ”๋“œ ๊ฐ„์†Œํ™”

๋ฐ˜ํ™˜ ๊ฐ’ ํŠน์„ฑ

  • ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด ๋ฐ˜ํ™˜: apply, also → ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ์ง€์›
  • ๋žŒ๋‹ค ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜: let, run, with → ์ตœ์ข… ๊ณ„์‚ฐ๊ฐ’ ๋ฐ˜ํ™˜

ํ™•์žฅ ํ•จ์ˆ˜ ์—ฌ๋ถ€

  • ํ™•์žฅ ํ•จ์ˆ˜ ํ˜•ํƒœ: let, run, apply, also
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜•ํƒœ: with → ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด ์ „๋‹ฌ

๊ฐœ๋ณ„ ํ•จ์ˆ˜์˜ ํŠน์„ฑ๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€

1. let: ์•ˆ์ „ํ•œ ๋ณ€ํ™˜๊ณผ ๋ฒ”์œ„ ์ œํ•œ

val processed = user?.let { 
    require(it.age >= 18) // ๋„ ๊ฒ€์‚ฌ์™€ ์œ ํšจ์„ฑ ๊ฒ€์ฆ[6][8]
    "${it.name.toUpperCase()} (${it.age + 5})" // ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜[1][10]
}
  • ํ•ต์‹ฌ ํŠน์ง•: it์œผ๋กœ ๊ฐ์ฒด ์ ‘๊ทผ, ๋„ ๊ฐ€๋Šฅ์„ฑ ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™”
  • ์ ํ•ฉํ•œ ์ƒํ™ฉ:
    • ๋„ ์ฒดํฌ ํ›„ ํŠน์ • ์—ฐ์‚ฐ ์ˆ˜ํ–‰
    • ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฒ”์œ„ ์ œํ•œ
    • ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ์˜ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ

2. run: ์œ ์—ฐํ•œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ

val configuration = ServerConfig().run {
    port = 8080 // this ์ƒ๋žต ๊ฐ€๋Šฅ[4][9]
    timeout = 60_000
    calculateMaxConnections() // ๊ฐ์ฒด ์ดˆ๊ธฐํ™”์™€ ๊ณ„์‚ฐ ๊ฒฐํ•ฉ[5][7]
}
  • ํ•ต์‹ฌ ํŠน์ง•: this ์ปจํ…์ŠคํŠธ, ํ™•์žฅ/๋น„ํ™•์žฅ ํ•จ์ˆ˜ ์ด์ค‘์„ฑ
  • ์ ํ•ฉํ•œ ์ƒํ™ฉ:
    • ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”
    • ๋ณต์žกํ•œ ๊ณ„์‚ฐ์‹ ํ‘œํ˜„
    • ์ž„์‹œ ์Šค์ฝ”ํ”„ ์ƒ์„ฑ

3. apply: ๊ฐ์ฒด ๊ตฌ์„ฑ ์ „๋ฌธ๊ฐ€

val dialog = AlertDialog.Builder(context).apply {
    setTitle("๊ฒฝ๊ณ ") // this ์ƒ๋žต[2][4]
    setMessage("์ €์žฅํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?")
    setPositiveButton("์˜ˆ") { _, _ -> save() }
}.create()
  • ํ•ต์‹ฌ ํŠน์ง•: ๊ฐ์ฒด ์ž์ฒด ๋ฐ˜ํ™˜, ๋นŒ๋” ํŒจํ„ด๊ณผ ๊ถํ•ฉ
  • ์ ํ•ฉํ•œ ์ƒํ™ฉ:
    • ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ผ๊ด„ ์„ค์ •
    • ๋นŒ๋” ํŒจํ„ด ๊ตฌํ˜„
    • ๋ถˆ๋ณ€ ๊ฐ์ฒด ์ƒ์„ฑ ์ „ ์ดˆ๊ธฐํ™”

4. also: ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ด€๋ฆฌ์ž

File("data.txt").also {
    println("ํŒŒ์ผ ์ƒ์„ฑ ๊ฒฝ๋กœ: ${it.absolutePath}") // ๋กœ๊น…[3][8]
}.writeText("๋‚ด์šฉ")
  • ํ•ต์‹ฌ ํŠน์ง•: ๊ฐ์ฒด ์ „๋‹ฌ ํ›„ ์ถ”๊ฐ€ ์ž‘์—…
  • ์ ํ•ฉํ•œ ์ƒํ™ฉ:
    • ๋””๋ฒ„๊น… ๋กœ๊ทธ ์ถœ๋ ฅ
    • ๊ฐ์ฒด ์ƒํƒœ ๊ฒ€์ฆ
    • ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๋™ ์ „ ์ฒ˜๋ฆฌ

5. with: ๊ทธ๋ฃนํ™” ์—ฐ์‚ฐ์ž

with(recyclerView) {
    adapter = CustomAdapter() // this ์ƒ๋žต[2][4]
    layoutManager = LinearLayoutManager(context)
    addItemDecoration(DividerItemDecoration(context, VERTICAL))
}
  • ํ•ต์‹ฌ ํŠน์ง•: ๋น„ํ™•์žฅ ํ•จ์ˆ˜, ๋„ ์•ˆ์ „์„ฑ ์—†์Œ
  • ์ ํ•ฉํ•œ ์ƒํ™ฉ:
    • ๋„์ด ์•„๋‹Œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‹ค์ค‘ ํ˜ธ์ถœ
    • ๊ด€๋ จ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทธ๋ฃนํ™”
    • Java ์Šคํƒ€์ผ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ๋Œ€์ฒด

ํ•จ์ˆ˜ ์„ ํƒ ๊ฐ€์ด๋“œ๋ผ์ธ

1. ๋ฐ˜ํ™˜ ๊ฐ’ ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ

  • ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ํ•„์š”ํ•˜๋ฉด → apply, also
  • ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•˜๋ฉด → let, run, with

2. ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ ํŒจํ„ด ๋ถ„์„

  • ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ์‹œ → apply, also
  • ์ค‘๊ฐ„ ๋ณ€ํ™˜ ์ž‘์—… ์‹œ → let, run

3. ๋„ ์•ˆ์ „์„ฑ ๊ณ ๋ ค

  • ๋„ ๊ฐ€๋Šฅ ๊ฐ์ฒด ์ฒ˜๋ฆฌ → let (?.let)
  • ๋„์ด ํ™•์‹คํ•œ ๊ฐ์ฒด → with

4. ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒฐ์ •

  • ๋ช…์‹œ์  ๋ณ€์ˆ˜๋ช… ์„ ํ˜ธ → let, also
  • ๊ฐ„๊ฒฐํ•œ ํ‘œํ˜„ ์„ ํ˜ธ → run, apply

์‹ค์ „ ์ ์šฉ ์‹œ ์ฃผ์˜์ 

์ค‘์ฒฉ ์‚ฌ์šฉ ํšŒํ”ผ: ๊ณผ๋„ํ•œ ์ค‘์ฒฉ์€ ๊ฐ€๋…์„ฑ์„ ํ•ด์นจ

// ๋‚˜์œ ์˜ˆ
user?.let { u ->
    u.orders?.let { o ->
        o.items?.let { 
            // ...
        }
    }
}

// ๊ฐœ์„  ์˜ˆ
user?.orders?.items?.let { 
    // ...
}

์ปจํ…์ŠคํŠธ ํ˜ผ๋™ ๋ฐฉ์ง€: this/it ๋‚จ์šฉ ์‹œ ๊ฐ์ฒด ์‹๋ณ„ ์–ด๋ ค์›€

data class User(val name: String, var age: Int)

fun process(user: User) = user.run {
    age = calculateAge(age) // this.age ๋Œ€์‹  age ์ง์ ‘ ์ ‘๊ทผ
    this // ๋ช…์‹œ์  ๋ฐ˜ํ™˜
}

์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ: ์ธ๋ผ์ธ ํ•จ์ˆ˜ ํŠน์„ฑ ์ดํ•ด

// ์ปดํŒŒ์ผ ์‹œ ์ธ๋ผ์ธ ์ฒ˜๋ฆฌ๋จ
inline fun <T> T.customApply(block: T.() -> Unit): T {
    block()
    return this
}

ํŒ€ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜: ์ผ๊ด€๋œ ์Šคํƒ€์ผ ์œ ์ง€

// ํŒ€ ๊ทœ์น™ ์˜ˆ์‹œ
// apply: ๊ฐ์ฒด ๊ตฌ์„ฑ ์ „์šฉ
// also: ๋กœ๊น… ๋ฐ ๊ฒ€์ฆ
// let: ๋„ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

๊ณ ๊ธ‰ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

1. DSL(Domain Specific Language) ๊ตฌ์„ฑ

fun createMenu() = menu {
    item("Home") { icon = R.drawable.home }
    item("Search") { 
        visible = hasSearchPermission 
        onClick { showSearch() }
    }
}.apply {
    setTheme(DarkTheme)
}

private fun menu(block: MenuBuilder.() -> Unit) = MenuBuilder().apply(block)

2. ์•ˆ์ „ํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

FileInputStream("data.txt").use { fis ->
    fis.bufferedReader().use { reader ->
        reader.lineSequence()
            .filter { it.isNotBlank() }
            .map { it.split(",") }
            .forEach { println("Processed: $it") }
    }
}.also { 
    println("ํŒŒ์ผ ์ฒ˜๋ฆฌ ์™„๋ฃŒ") 
}

3. ๋ณตํ•ฉ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ

val report = dataSource.getRawData()
    ?.let(::parseToIntermediateFormat)
    ?.run { 
        validate(this)
        transformForReporting(this) 
    }
    ?.also { logGeneration(it) }
    ?.apply { exportToFile(this) }

๊ฒฐ๋ก : ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์ ์˜ ์„ ํƒ

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

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'Languages/Kotlin' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Kotlin] ํด๋ž˜์Šค ์ ‘๊ทผ ์ œ์–ด์ž์™€ ์ˆ˜์ •์ž(protected, inner, private, open)
  • [Kotlin] class์™€ object ์ฐจ์ด์ 
  • [Kotlin] inline ํ‚ค์›Œ๋“œ: ์˜๋ฏธ์™€ ์ตœ์ ์˜ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„
  • Kotlin ํ™•์žฅ ํ•จ์ˆ˜(Extension Function) ๋ž€
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, 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] ์ฝ”ํ‹€๋ฆฐ let, run, apply, also, with์˜ ์ฐจ์ด์™€ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์ƒํ™ฉ ๋ถ„์„
์ƒ๋‹จ์œผ๋กœ

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