Scope function(범위 지정 함수)은 객체의 컨텍스트에서 코드 블록을 실행하고 해당 객체를 참조할 수 있는 함수
let, run, with, apply, also
함수 | 수신 객체 | 반환 값 | 확장함수 여부 |
let | it | 람다 | O |
run | this | 람다 | O |
with | this | 람다 | X |
apply | this | 객체 | O |
also | it | 객체 | O |
let
- nullable한 객체를 안전하게 처리할 때 주로 사용
- 객체가 null이 아닌 경우에만 코드 블록이 실행
val strNull: String? = null
val str: String? = "Hello"
val lengthNull = strNull?.let {
//실행 안 됨
println("let() called on $it")
processNonNullString(it)
it.length
}
val length = str?.let {
//실행 됨
println("let() called on $it")
processNonNullString(it)
it.length
}
//출력
let() called on Hello
수신 객체 : it(생략 불가)
반환 값 : 마지막 줄
with
- 객체의 여러 속성을 한꺼번에 사용하고자 할 때 주로 사용
- 결과 값이 필요하지 않은 경우 컨텍스트 객체에서 함수를 호출할 때
- 확장 함수가 아님
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
val firstAndLast = with(numbers) {
"The first element is ${first()}," +
" the last element is ${last()}"
}
println(firstAndLast)
//출력
'with' is called with argument [one, two, three]
It contains 3 elements
The first element is one, the last element is three
수신 객체 : this(생략 가능)
반환 값 : 마지막 줄
run
- with와 같은 동작을 하지만 확장 함수로 구현
- 람다가 객체를 초기화하고 계산 후 결과를 반환할 때
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
//출력
Result for query 'Default request to port 8080'
수신 객체 : this(생략 가능)
반환 값 : 마지막 줄
apply
- 객체의 속성을 변경하거나 초기화할 때 사용
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
//출력
Person(name=Adam, age=32, city=London)
수신 객체 : this(생략 가능)
반환 값 : 객체 자체
also
- 객체를 변경하지 않고 객체의 속성을 로깅하거나 다른 동작을 수행할 때 사용
val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("The list elements before adding new one: $it") }
.add("four")
//출력
The list elements before adding new one: [one, two, three]
수신 객체 : it(생략 불가)
반환 값 : 객체 자체
참고문서
'Kotlin' 카테고리의 다른 글
[Kotlin] StateFlow: Android 상태 관리를 위한 필수 도구 (1) | 2024.11.15 |
---|---|
[Kotlin] 언더스코어(_)를 변수 이름에 붙이는 이유 (1) | 2024.09.03 |
[Kotlin] Coroutine Suspend function (0) | 2024.03.25 |
[Kotlin] Data class, Sealed class (0) | 2024.03.06 |
[Kotlin] object, companion object (0) | 2024.03.05 |