π λ²μ μ§μ ν¨μλ?
Kotlinμ νμ€ λΌμ΄λΈλ¬λ¦¬μλ κ°μ²΄μ 컨ν μ€νΈ λ΄μμ μ½λ λΈλ‘μ μ€ννλ κ²μ΄ λͺ©μ μΈ μ¬λ¬ λ²μ μ§μ ν¨μλ€μ΄ μλ€. λλ€ μμ΄ μλ κ°μ²΄μμ μ΄λ¬ν ν¨μλ₯Ό νΈμΆνλ©΄ μμ λ²μκ° νμ±λκ³ μ΄λ° λ²μμμλ μ΄λ¦ μμ΄ κ°μ²΄μ μ‘μΈμ€ν μ μλ€. μ΄λ¬ν λ²μ ν¨μμ μ’ λ₯λ‘λ let, run, with, apply, alsoμ λ€μ― κ°μ§κ° μλ€.
κΈ°λ³Έμ μΌλ‘ λ²μ ν¨μλ€μ λμΌν λͺ©μ μ κ°μ§κ³ μμ μ μννλ€. λ€λ₯Έ μ μ μ΄ κ°μ²΄κ° λΈλ‘ λ΄μμ μ¬μ© κ°λ₯νκ² λλ λ°©μμ΄ μ 체 ννμμ κ²°κ³Όμ΄λ€. μ΄λ° μ΄μ λ‘ νλμ λ²μ ν¨μλ₯Ό κ³ λ₯΄λ κ²μ νλ μΌμ΄λ€. μ΄μ λΆν° λ²μ κΈ°λ₯κ³Ό ν΄λΉ κ·μΉμ μ°¨μ΄μ μ λν μμΈν μ€λͺ μ μ 곡νκ² λ€.
λ²μ ν¨μ μμ½
μμ ν μ΄λΈμ λ²μ ν¨μμ μ°¨μ΄μ λ€μ λνλΈ ν μ΄λΈμ΄λ€. κ°μ₯ λμ λλ κ²μ Object referenceλ itκ³Ό thisλ‘ λλμ΄μ Έ μκ³ Return valueλ Lambda resultμ Context objectκ° μλ€λ κ²μ΄λ€.
π€ΌβοΈ λ²μ μ§μ ν¨μλ€μ ꡬλ³νλ λ°©λ²
λ²μ μ§μ ν¨μμ μ°¨μ΄λ₯Ό μλ κ²μ κ° μν©μ μ΄λ€ λ²μ μ§μ ν¨μλ₯Ό μ¬μ©ν΄μΌ νλμ§ μλ κ°μ₯ μ’μ λ°©λ²μ΄λ€. κ° λ²μ μ§μ ν¨μλ€κ°μ μμμ 보μλ―μ΄ 2κ°μ μ°¨μ΄κ° μ‘΄μ¬νλ€.
1. Context Object (컨ν μ€νΈ κ°μ²΄)λ₯Ό μ°Έμ‘°νλ λ°©μ
2. λ°ν κ°
Context Object (컨ν μ€νΈ κ°μ²΄)λ₯Ό μ°Έμ‘°νλ λ°©μ
λ²μ μ§μ ν¨μ λ΄μμ 컨ν μ€νΈ κ°μ²΄λ μ€μ μ΄λ¦ λμ 짧μ μ°Έμ‘°λ‘ μ¬μ©ν μ μλ€. κ° λ²μ μ§μ ν¨μλ 컨ν μ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νκΈ° μν΄ λλ€ μμ μ(this) λλ λλ€ μΈμ (it) λ κ°μ§ λ°©λ² μ€ νλλ₯Ό μ¬μ©νλ€. λμ κΈ°λ₯μ λμΌνλ€.
fun main() {
val str = "Hello"
// this
str.run {
println("The string's length: $length")
// thisλ μλ΅ κ°λ₯νλ€.
//println("The string's length: ${this.length}")
}
// it
str.let {
println("The string's length is ${it.length}")
}
}
this
λλΆλΆμ μν©μμ 'this'λ μλ΅ κ°λ₯νλ€. νμ§λ§ 'this'λ₯Ό μλ΅νλ©΄ μμ λ©€λ²μ μΈλΆ κ°μ²΄λ₯Ό ꡬλΆνκΈ° μ΄λ €μΈ μ μλ€. λ°λΌμ ν¨μλ₯Ό νΈμΆνκ±°λ μμ±μ κ°μ ν λΉνμ¬ μμ λ©€λ²μκ² μλνλ λλ€μ κ²½μ° 'this'λ₯Ό μλ΅νμ§ μλ κ²μ΄ μ’λ€. run, with, applyκ° 'this'λ₯Ό μ¬μ©ν΄ 컨ν μ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ μλ€.
it
'it'μ μΈμ μ΄λ¦μ΄ μ§μ λμ§ μλ κ²½μ° default κ°μ 'it'μΌλ‘ μ€μ νλ€. νμ§λ§ κ°μ²΄μ ν¨μλ μμ±μ νΈμΆν λ 'this'μ κ°μ΄ μμμ μΌλ‘ κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€. λ°λΌμ κ°μ²΄λ₯Ό ν¨μ νΈμΆμ μΈμλ‘ μ£Όλ‘ μ¬μ©ν λλ 'it'μ ν΅ν΄ 컨ν μ€νΈ κ°μ²΄μ μ κ·Όνλ κ²μ΄ μ’λ€. μ½λ λΈλ‘μμ μ¬λ¬ λ³μλ₯Ό μ¬μ©ν λλ 'it'μ μ¬μ©νλ κ²μ΄ μ’λ€. let, alsoκ° 'it'λ₯Ό μ¬μ©ν΄ 컨ν μ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ μλ€.
λ°ν κ°
λ²μ μ§μ ν¨μλ€μ΄ λ°ννλ κ°μ 2κ°μ§λ‘ λλλ€. 컨ν μ€νΈ κ°μ²΄μ λλ€ κ²°κ³Όμ΄λ€. λ€μμ μνν μμ μ λ°λΌ μνλ λ°ν κ°μ μ μ€νκ² κ³ λ €ν΄μΌ νλ©° μ΄λ μ¬μ©ν μ΅μμ λ²μ κΈ°λ₯μ μ ννλλ° λμμ΄ λλ€.
Context object
applyμ alsoμ λ°ν κ°μ 컨ν μ€νΈ κ°μ²΄ μ체μ΄λ€. λ°λΌμ μ΄λ€μ λμΌν κ°μ²΄μ λν΄ μ°μ΄μ΄ ν¨μ νΈμΆμ κ³μν μ μλ€.
val numberList = mutableListOf<Double>()
numberList.also { println("Populating the list") }
.apply {
add(2.71)
add(3.14)
add(1.0)
}
.also { println(it) }
.also { println("Sorting the list") }
.sort()
println(numberList)
κ²°κ³Ό
Populating the list
[2.71, 3.14, 1.0]
Sorting the list
[1.0, 2.71, 3.14]
Lambda result
let, run, withλ λλ€ κ²°κ³Όλ₯Ό λ°ννλ€. κ·Έλμ λ³μμ κ²°κ³Όλ₯Ό ν λΉνκ±°λ κ²°κ³Όμ λν μμ μ μ°κ²°νλ μμ μ μνν λ μ¬μ©ν μ μλ€.
val numbers = mutableListOf("one", "two", "three")
val countEndsWithE = numbers.run {
add("four")
add("five")
count { it.endsWith("e") }
}
println("There are $countEndsWithE elements that end with e.")
π λ²μ μ§μ ν¨μ
let
'let'μ 'it'μΌλ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©° λλ€ κ²°κ³Όλ₯Ό λ°ννλ€.
'let' μ νΈμΆ 체μΈμ κ²°κ³Όμ λν΄ νλ μ΄μμ ν¨μλ₯Ό νΈμΆνλ λ° μ¬μ©ν μ μλ€. μλμ μμλ StringμΌλ‘ λ numbers 리μ€νΈμμ λ¬Έμμ΄μ κΈΈμ΄κ° 3 μ΄κ³ΌμΈ numberλ§ μΆλ ₯νλ μ½λμ΄λ€.
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
μμ μ½λμ λ¨μ μ λ°λ‘ 'resultList'λΌλ λ³μκ° μ€μ§ μΆλ ₯μ μν΄ μ¬μ©λκ³ μλ€λ κ²μ΄λ€. λν κ°λ μ± λν λ¨μ΄μ§λ€. μ΄μ 'let'μ μ¬μ©ν΄ λ³΄κ² λ€.
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
}
μ°λ¦° μ΄μ 'resultList'λΌλ λ³μλ₯Ό μ¬μ©νμ§ μκ³ κ²°κ³Όλ₯Ό μΆλ ₯ν μ μλ€. 'let'μ κ°μ₯ ν° μ₯μ μ λ°λ‘ nullμ΄ λ μ μλ κ°μ²΄μ μ¬μ©ν μ μλ€λ κ²μ΄λ€.
val str: String? = "Hello"
val length = str?.let {
println("let() called on $it")
it.length
}
μμ lengthλ strμ΄ nullμ΄ μλ λλ§ κ°μ΄ ν λΉλκ² λλ€.
with
'with'μ 'this'μΌλ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©° λλ€ κ²°κ³Όλ₯Ό λ°ννλ€.
'with'μ λ€λ₯Έ λ²μ μ§μ ν¨μλ€κ³Όλ λ€λ₯Έ μ μ΄ μλ€. λ°λ‘ νμ₯ ν¨μκ° μλλΌλ κ²μ΄λ€. λ°λΌμ λ°νλ κ²°κ³Όλ₯Ό μ¬μ©ν νμκ° μμ λ 컨ν μ€νΈ κ°μ²΄μ ν¨μλ₯Ό νΈμΆνκΈ° μν΄ 'with'μ μ¬μ©νλ κ²μ΄ μ’λ€.
'with'μ "μ΄ κ°μ²΄μ ν¨κ» λ€μ νλμ μννλ€" λ‘ ν΄μν μ μλ€.
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
run
'run'μ 'this'μΌλ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©° λλ€ κ²°κ³Όλ₯Ό λ°ννλ€.
'run'μ νμ₯ ν¨μλ‘ κ΅¬νλ 'with'μ΄λΌκ³ ν μ μλ€. λν 'run'μ λλ€κ° κ°μ²΄λ₯Ό μ΄κΈ°ννκ³ λ°ν κ°μ κ³μ°νλ κ²½μ°μ μ μ©νλ€. λ°λΌμ 'run'μ μ¬μ©νλ©΄ μ΄κΈ°νμ λ°ν κ°μ λμμ μνν μ μλ€.
data class Person(val name: String, var age: Int)
fun main() {
val person = Person("John", 30)
person.run {
println("Name: $name, Age: $age")
age += 1
println("Updated Age: $age")
}
}
'run'μ λΉ-νμ₯ ν¨μλ‘ μ¬μ©ν μ μλ€. 'with'μ νμ₯ ν¨μ λ²μ μ΄ 'run' μ΄κΈ°μ 'run'μ λΉ-νμ₯ ν¨μλ‘ μ¬μ©νλ©΄ 'with'μ΄λΌκ³ μκ°ν μ μμ§λ§, runμ λ°λ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό κ°μ§μ§ μκ³ μ€μ§ λλ€ κ²°κ³Όλ§μ λ°ννλ€.
val message = "Hello, Kotlin!"
val result = run {
val formattedMessage = message.toUpperCase()
val reversedMessage = formattedMessage.reversed()
"Final message: $reversedMessage"
}
println(result)
apply
'apply'μ 'this'μΌλ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©° 컨ν μ€νΈ κ°μ²΄ μ체λ₯Ό λ°ννλ€.
'apply'λ 컨ν μ€νΈ κ°μ²΄ μ체λ₯Ό λ°ννκΈ° λλ¬Έμ, λ°ν κ°μ κ°μ§ μκ³ μ£Όλ‘ μμ μ κ°μ²΄μ λ©€λ²μ μμ©νλ μ½λ λΈλ‘μ μ¬μ©νλ κ²μ΄ κΆμ₯λλ€. 'apply'μ κ°μ²΄λ₯Ό ꡬμ±ν λ κ°μ₯ λ§μ΄ μ¬μ©λλ€.
'apply'λ "λ€μ ν λΉμ κ°μ²΄μ μ μ©νλ€"λ‘ ν΄μν μ μλ€.
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
also
'also'μ 'it'μΌλ‘ 컨νμ€νΈ κ°μ²΄λ₯Ό μ°Έμ‘°νλ©° 컨ν μ€νΈ κ°μ²΄ μ체λ₯Ό λ°ννλ€.
'also'λ 컨ν μ€νΈ κ°μ²΄λ₯Ό μΈμλ‘ λ°μ μΌλΆ λμμ μννλ λ° μ μ©νλ€. 'also'λ₯Ό μ¬μ©νμ¬ μμ±μ΄λ ν¨μκ° μλ κ°μ²΄μ λν μ°Έμ‘°κ° νμν λμμ΄λ μΈλΆ λ²μμμμ 'this' μ°Έμ‘°λ₯Ό κ°λ €μ£Όκ³ μΆμ§ μμ λ μ¬μ©ν μ μλ€.
'also'λ "κ·Έλ¦¬κ³ λν κ°μ²΄μ ν¨κ» λ€μμ μννλ€"λ‘ ν΄μν μ μλ€.
Reference
'Android > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Deep Dives into Coroutines on JVM] (1) - μ½λ£¨ν΄κ³Ό Callback (0) | 2023.09.13 |
---|---|
Sealed Classμ Enum Class λ μ¬μ©ν΄μΌ νλμ? (0) | 2023.09.04 |
Generics (μ λ€λ¦) (0) | 2023.06.29 |
[2] MVVM Repositoryμ Roomκ³Ό Hilt μ¬μ©νκΈ° (0) | 2023.06.19 |
[1] MVVM Repositoryμ Roomκ³Ό Hilt μ¬μ©νκΈ° (0) | 2023.06.19 |