매번 헷갈리는 Kotlin Scope Function을 정리해보자.
// apply를 활용하면 다음의 방법으로 수신객체의 프로퍼티 지정이 가능함
// 프로퍼티 설정 시 마다 Person을 쓰지 않아도 돼서 가독성이 좋음
val person = Person().apply {
name = "im"
age = 29
}
// run은 apply와 똑같이 동작하지만 수신객채를 retrun하지 않음
// run 블록의 마지막 라인을 ruturn하는 범위 지정 함수
// data.kt
data class Person(
val person = Person().apply {
name = "im"
age = 29
) {
fun isOld() : Boolean = age > 29
}
// main.kt
fun main() {
val person = Person(name = "im", age = 29 )
val isOld = person.run {
age = 28
isOld() // retrun 값
}
println($isOld) // false
}
// with는 수신 객체에 대한 작업 후 마지막 라인 return
// run과 유사함 with는 실제로 거의 쓰이지 않음 (run을 쓰자!!)
fun main() {
val person = Person(name = "im", age = 29 )
val isOld = with(person) {
age = 28
isOld() // retrun 값
}
println($isOld) // false
}
// let은 수신객체를 이용해 작업을 한 후 마지막 줄을 reutrn할 때 사용
// run이나 with등을 쓸때는 it으로 접근해야 함
/**
* 1. Null check 후 코드를 실행해야 하는 경우
* 2. Nullable 한 수신객체를 다른타입의 변수로 변환해야 하는 경우
*/
fun main () {
var person: Person? = null
val ischk = person?.let { it: Person ->
fnToOldChk(it)
}
}
// 실무에서는 Nullable한 값이 아닐 경우에는 urn을 사용하는것이 일반적
// 잘 안쓰임, 보통 로깅이나 디버깅등에 쓰임