μ½νλ¦°μ νμ€ λΌμ΄λΈλ¬λ¦¬λ λ€μν κΈ°λ₯ κ³Ό νΈλ¦¬ν κΈ°λ₯μΌλ‘ ν¨μν νλ‘κ·Έλλ°μ μ½κ² μ μ©ν μ μλλ‘ λμμ€λλ€.
κ·Έμ€μμλ apply, with, let, also, runμ κ°μ λ²μ μ§μ ν¨μλ€μ΄ μμ΅λλ€.
κ° κΈ°λ₯λ€μ΄ μΌν 보면 λΉμ·ν΄μ ν·κ°λ¦΄ μ μκ³ μ¬μ©νλ©΄ λ³΄λ€ κΉλνκ² μ½λλ₯Ό κ΄λ¦¬ ν μ μμ΅λλ€.
λ²μ μ§μ ν¨μ λ νΉμ κ°μ²΄μ λν μμ μ λΈλ‘ μμ λ£μ΄ μ€νν μ μλλ‘ νλ ν¨μμ λλ€.
λΈλ‘μ νΉμ κ°μ²΄μ λν΄ ν μμ μ λ²μκ° λλ©°, λ°λΌμ λ²μ μ§μ ν¨μλΌ λΆλ₯Έλ€.
λ€λ₯Έ λ§λ‘ μμ κ°μ²΄ μ§μ λλ€(ν¨μ) λΌκ³ λ λΆλ₯Έλ€. → μμ κ°μ²΄λ₯Ό λͺ μνμ§ μκ±°λ itμ νΈμΆνλ κ²λ§μΌλ‘ λλ€ μμμ μμ κ°μ²΄μ λ©μλλ₯Ό νΈμΆν μ μλλ‘ ν΄μ£ΌκΈ° λλ¬Έμ΄λ€.
μ΄κ²μ΄ κ°λ₯ν μ΄μ λ λΈλ‘(block) λλ€μμμ μμ κ°μ²΄λ₯Ό λλ€μ μ λ ₯ νλΌλ―Έν° νΉμ μμ κ°μ²΄λ‘ μ¬μ©νμκΈ° λλ¬Έμ΄λ€.
λ¬΄μ¨ λ§π€μΈμ§ λͺ¨λ₯΄κ² μΌλ μλ μμ λ₯Ό 보며 νμΈν΄λ³΄μ(μ¬λ¬λ² 보λ€λ³΄λ©΄ λ¬΄μ¨ λ§μΈμ§ μκ² λκ² μ§,,,?)
apply
inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
- μμ κ°μ²΄μ λλ€ λ΄λΆμμ μμ κ°μ²΄μ ν¨μλ₯Ό μ¬μ© β, μμ κ°μ²΄ μμ μ λ€μ λ°ν νλ €λ κ²½μ° apply μ¬μ©
μ¬μ© μ)
val Peter = Person().apply {
// applyμ λΈλ‘μμλ μ€μ§ νλ‘νΌν°λ§ μ¬μ©ν©λλ€.
name = “Peter”
age = 18
}
β
// μ¬μ©νμ§ μμΌλ©΄
val clark = Person()
β
clark.name = “clark”
clark.age = 18
μ₯μ → clark μ΄λΌλ λ³μλ₯Ό κ³μ νΈμΆνμ§ μμλ λλ€. κ°λ μ± β¬οΈ
let
inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
- run κ³Ό withμ λΉμ·νλ€.
- λ€λ₯Έμ → μμ κ°μ²΄μ μ κ·Όν λ it.name μμΌλ‘ μ κ·Όν΄μΌνλ€.
- λ€λ₯Έμ 2 → nullableν κ°μ μ²λ¦¬ν΄μΌν λ μ¬μ©
- λ¬Όλ‘ letμ nullable νμ§ μμ λμμλ μ¬μ©ν μ μμ§λ§, μ€λ¬΄μμλ nullableν κ°μ΄ μλκ²½μ° runμ μ¬μ©νλ κ²μ΄ μΌλ°μ .
μ¬μ© μ)
// 1) μ§μ λ κ°μ΄ **nullμ΄ μλ κ²½μ°μ μ½λλ₯Ό μ€ν**ν΄μΌ νλ κ²½μ°
getNullablePerson()?.let {
β
// null μ΄ μλ λλ§ μ€νλ©λλ€.
promote(it)
}
// 2) Nullable κ°μ²΄λ₯Ό λ€λ₯Έ nullable κ°μ²΄λ‘ λ³ννλ κ²½μ°
val drivesLicence : Licence? = getNullablePerson()?.let {
β
// nullable Personal κ°μ²΄λ₯Ό nullable driversLicence κ°μ²΄λ‘ λ³κ²½ν©λλ€.
licenceService.getDriversLicence(it)
}
// 3) λ¨μΌ μ§μ λ³μμ λ²μλ₯Ό μ ννλ κ²½μ°
val person : Person = getPerson()
β
getPersonDao().let { dao ->
// λ³μ dao μ λ²μλ μ΄ λΈλ‘ μμΌλ‘ μ νλ©λλ€.
dao.insert(person)
}
β
// letμ μ μ°λ©΄
// 1)
val person : Person? = getPromotablePerson()
β
if (person != null){
promte(person)
}
β
// 2)
val driver : Person? = getDriver()
β
val driverLicence : Licence? =
if (driver == null)
null
else
licenceService.getDriversLicence(it)
β
// 3)
val person : Person = getPerson()
β
val personDao : PersonDao = getPersonDao()
β
personDao.insert(person)
with
inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
- withλ μμ κ°μ²΄μ λν μμ ν λ§μ§λ§ λΌμΈμ return νλ€.
- run κ³Ό μμ λκ°μ΄ λμ!
- λ€λ₯Έμ → runμ νμ₯ν¨μ, withλ μμ κ°μ²΄ νλΌλ―Έν°λ‘ λ°μ μ¬μ©ν΄μΌν¨.
- run μ μ¬μ©νλκ² ν¨μ¬ κΉλνλ―λ‘ μ€μ λ‘λ κ±°μ μ¬μ© β
- Non-nullable μμ κ°μ²΄μ΄κ³ κ²°κ³Όκ° νμνμ§ μμ κ²½μ°μλ§ withλ₯Ό μ¬μ©ν©λλ€.
μ¬μ© μ)
val person : Person = getPerson()
β
with(person) {
print(name)
print(age)
}
β
// μ μ°λ©΄
val person : Person = getPerson()
β
print(person.name)
print(person.age)
run
inline fun <T, R> T.run(block: T.() -> R): R {
return block()
}
- run μ apply μ λκ°μ΄ λμ
- BUT μμ κ°μ²΄ return β
- run λΈλ‘μ λ§μ§λ§ λΌμΈμ return νλ€.
- μμ κ°μ²΄μ λν΄ νΉμ ν λμμ μνν ν κ²°κ³Όκ°μ λ¦¬ν΄ λ°μμΌ ν κ²½μ° μ¬μ©
- μ΄λ€ κ°μ κ³μ°ν νμκ° μκ±°λ μ¬λ¬κ°μ μ§μ λ³μμ λ²μλ₯Ό μ ννλ €λ©΄ runμ μ¬μ©ν©λλ€.
- λ§€κ° λ³μλ‘ μ λ¬λ λͺ μμ μμ κ°μ²΄λ₯Ό μμμ μμ κ°μ²΄λ‘ λ³νν λ run()μ μ¬μ©ν μ μμ΅λλ€.
μ¬μ© μ)
data class Person(
var name: String = "",
var age: Int = 0,
var temperature: Float = 36.5f
) {
fun isSick(): Boolean = temperature > 37.4f
}
β
fun main() {
val person: Person = Person(name = "Jacob", age = 29, temperature = 36.5f)
val isPersonSick = person.run {
temperature = 37.6f
isSick() // return κ°
}
β
print("isPersonSick = $isPersonSick")
}
also
inline fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
- applyμ λ§μ°¬κ°μ§λ‘ μμ κ°μ²΄ μμ μ λ°ν
- λ΄λΆ μμ κ°μ²΄λ₯Ό μ¬μ©νκΈ° μν΄μλ itμ μ¬μ©ν΄μΌν¨.
- λΈλ‘ ν¨μκ° λ€λ₯Έ κ°μ λ°ν ν΄μΌνλ κ²½μ°μλ alsoλ₯Ό μ¬μ©ν μ μμ΅λλ€.
- μμ κ°μ²΄ λλ€κ° μ λ¬λ μμ κ°μ²΄λ₯Ό μ ν μ¬μ©νμ§ μκ±°λ μμ κ°μ²΄μ μμ±μ λ³κ²½νμ§ μκ³ μ¬μ©νλ κ²½μ° alsoλ₯Ό μ¬μ©ν©λλ€.
- μλ₯Ό λ€μλ©΄, κ°μ²΄μ μ¬μ΄λ μ΄ν©νΈλ₯Ό νμΈνκ±°λ μμ κ°μ²΄μ νλ‘νΌν°μ λ°μ΄ν°λ₯Ό ν λΉνκΈ° μ μ ν΄λΉ λ°μ΄ν°μ μ ν¨μ±μ κ²μ¬ν λ λ§€μ° μ μ©ν©λλ€
- μ¬λ¬ λ¬Έμ λ‘ also λ κ±°μ μ¬μ©λμ§ μμ
- μ¬μ©ν λλ νλ‘νΌν°λ₯Ό λ°κΎΈμ§ μκ³ λμμ μΆκ°μ μΌλ‘ ν΄μΌνλ κ²½μ°(λ‘κΉ λ±…)μμλ§ κ°~~λ μ¬μ©λλ€.
μ¬μ© μ)
class Book(author : Person) {
β
val author = author.also {
requiresNotNull(it.age)
print(it.name)
}
}
β
// μ μ°λ©΄
class Book(val author : Person) {
β
init{
requireNotNull(author.age)
print(author.name)
}
}
μ κΈ°λ₯μ μ¬μ©μ μ μν μ
- μ€μ²©μ΄ κ°λ₯νμ§λ§ κ°λ μ± β¬οΈ, νμ π ( μμΉμ μΌλ‘λ μ€μ²© X)
- apply, run, withλ μ€μ²©νμ§λ§μΈμ(μ΄μ : this μ΄λ¦μ λ€λ₯΄κ² μ§μ ν μ μκΈ°μ νΌλνκΈ° μ¬μ)
- alsoμ letμ μ€μ²© ν΄μΌλ§ ν λλ μμμ μμ κ°μ²΄λ₯Ό κ°λ₯΄ν€λ λ§€κ° λ³μμΈ itμ μ¬μ©νμ§ λ§μΈμ. λμ λͺ μμ μΈ μ΄λ¦μ μ 곡νμ¬ μ½λμμ μ΄λ¦μ΄ νΌλλμ§ μλλ‘ ν΄μΌν©λλ€.
- But μ€μ²©κ³Ό μ°λμ λ€λ₯΄λ€ chain
μ°λ μ)
private fun insert(user : User) = SqlBuilder().apply {
β
append(“insert into user (email, name, age) Values “)
append(“ (?”, user.email)
append(“ ,?”, user.name)
append(“ ,?)”, user.age)
β
}.also {
print(“Executing SQL update: $it.”)
}.run {
jdbc.update(this) > 0
}
μλ μ¬μ§μ κ° μ½λμ ꡬν λ°©μκ³Ό μλ₯Ό μ¬μ§μΌλ‘ μ 리 ν΄λ κ²μ΄κΈ°μ κΈ°μ΅μ΄ λμ§ μμ λ ν λ²μ© λ€μ¬λ€ 보면 μ’μ κ² κ°μ΅λλ€.
'Development > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π§ Kotlinμ Collection ν¨μ! - List κ°κ³΅μ μ½κ² ν΄λ΄ μλ€ (0) | 2023.04.05 |
---|