let
fun <T, R> T.let(block: (T) -> R): R
let함수를 사용하면 객체의 상태를 변경할 수 있다.
그리고 마지막에 작성된 값이 리턴된다. -> 즉, 블럭의 마지막 return 값에 따라 let의 return값이 달라진다.
또한, let블럭 안에는 non-null만 올 수 있어 non-null체크 시에 유용하게 쓸 수 있다.
let은 보통 non-null일 경우 값을 변경하고자 하거나 무언가를 반환하고자 할 때 사용한다.
<예시>
val person = Person("", 0)
val resultIt = person.let {
it.name = "James"
it.age = 56
it // (T)->R 부분에서의 R에 해당하는 반환값.
}
val nameStr = person?.let { it.name } ?: "Default Name"
//혹은,
val nameStr = "Default Name"
person?.let {
nameStr = it.name
}
With
fun <T, R> with(receiver: T, block: T.() -> R): R
객체의 receiver를 직접 입력받고, 객체를 사용하기 위한 두 번째 파라미터 블럭을 받는다.
이때 파라미터를 입력받으면 this를 사용하지 않고도 속성을 변경할 수 있다.
아래 예시처럼, with(T)타입으로 Person을 받으면 블럭 안에서 바로 프로퍼티에 접근이 가능하다. with는 let처럼 non-null의 객체를 사용하고 블럭의 return값이 필요하지 않을 때 사용한다. 그래서 주로 객체의 함수를 여러개 호출할 때 그룹화하는 용도로 활용된다.
<예시>
val person = Person("James", 56)
with(person) {
println(name)
println(age)
//자기자신을 반환해야 하는 경우 it이 아닌 this를 사용한다
}
run
fun <T, R> T.run(block: T.() -> R): R
non-null일 경우에만 실행할 수 있다.어떠한 값을 계산할 필요가 있을 때 사용한다.
마지막에 작성된 값을 리턴한다.
또는, 어떤 객체를 생성하기 위해 가독성을 높이는 역할을 한다.
<예시>
val person = Person("James", 56)
val ageNextYear = person.run {
++age
}
val person = run {
val name = "James"
val age = 56
Person(name, age)
}
apply
fun T.apply(block: T.() -> Unit): T
블럭 안에서 객체의 프로퍼티를 호출할 때 it이나 this를 사용할 필요가 없다.
블럭에서 return값이 없고 자기자신인 T를 반환한다.
주로 객체의 초기화나 변경시에 자주 사용된다.
<예시>
val person = Person("", 0)
val result = person.apply {
name = "James"
age = 56
}
also
fun T.also(block: (T) -> Unit): T
블럭함수의 입력을 it을 이용하여 프로퍼티에 it을 사용해 접근하는 것을 알 수 있다.
그래서 객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우 also를 사용한다.
<예시>
val person = Person("", 0)
val result = person.also {
it.name = "James"
it.age = 56
}
*정리
1) let
T.let{..}
블럭함수의 입력으로 T를 받았기때문에 it을 사용해 프로퍼티에 접근
마지막 값을 리턴
non-null을 검사하고 T의 프로퍼티의 값을 외부 변수에 접근할 때 사용
2) with
with(T){..}
블럭안에서 this없이 프로퍼티에 접근 가능
리턴값이 없다.
non-null만 가능하며 객체의 함수를 여러 개 호출할 때 그룹화 하기 위해 사용.
3) run
T.run{...}
블럭함수의 입력을 T로 받았기 때문에 it을 사용해 프로퍼티 접근
마지막에 작성된 값 리턴
어떤 객체를 생성할 때 가독성을 높이기 위해 사용.
4) apply
T.apply{...}
run과 유사하지만 it을 사용할 필요가 없고 return값을 받지 않으며 자기자신인 T를 반환한다.
객체 초기화시 사용된다.
5) also
T.also{...}
apply와 마찬가지로 자기자신을 반환한다.
단, it을 사용하여 프로퍼티에 접근한다.
출처: blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
'⚙️Backend > Kotlin' 카테고리의 다른 글
[ Kotlin ] 200913 정리 (0) | 2020.09.13 |
---|---|
[ Kotlin ] Intro (0) | 2020.09.13 |