[Kotlin] Scope Functions - let, run, with, apply, and also 에 대하여
2020. 2. 17. 18:44ㆍKotlin
반응형
오늘의 개념:
Kotlin Scope Functions
처음엔 정말 헷갈렸다. 그렇지만 차이를 알고 나니 정말 쉽다!
각 함수는 크게 2가지의 특징으로 나뉜다. 이것만 알면 끝!끝!
차이 1. Context object : this 또는 it
여기서 "Context object"란, 아래 코드를 보자.
val adam = Person("Adam").apply { // 여기서 Person 객체를 어떻게 받느냐의 의미. apply는 this 로 받음
age = 32 // 따라서, this.age 와 동일함
city = "London" // this.city와 동일
}
val adam = Person("Adam").also { // also는 it 으로 받음
it.age = 32
it.city = "London"
}
차이 2. Return value : object 또는 lamda result
object itself의 경우,
val numberList = mutableListOf<Double>()
numberList.apply {
add(2.71)
add(3.14)
add(1.0)
}
.also { println("Before sorting : $it") } // also는 object 자체를 반환하며, it을 사용
.sorted()
.apply { println("After sorting : $this") } // apply는 object 자체를 반환하며, this를 사용
// 결과값은 아래와 같음
// Before sorting : [2.71, 3.14, 1.0]
// After sorting : [1.0, 2.71, 3.14]
lamda result의 경우,
val list = mutableListOf("one", "two", "three")
val listSize = numbers.run { // run은 lamda result를 반환
add("four")
add("five")
it.size // 이게 lamda result가 됨.
}
println("List size : $listSize") // 결과 => List size : 5
각 Scope function 별 차이 정리
let | run | with | apply | also | |
Context object | it | this | this | this | it |
Return value | lamda result | lamda result | lamda result | object itselt | object itselt |
사용 예시
let
- non-null 값의 코드 블록을 실행할 때
val str: String? = "Hello"
//processNonNullString(str) // 컴파일 에러: str은 null이 될 수도 있으므로
// 아래와 같이 let으로 non-null값만 블럭에서 처리할 수 있다!
val length = str?.let { // let은 it으로 받음
processNonNullString(it) // OK: 'it'은 '?.let { }' 블럭 내에서 non-null !!
it.length
}
run
- 객체 초기화 (아래 apply 예시 참고)
- 결괏값 계산 후 return 할 때
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
with
- 객체에서 grouping function call(?).. 말보다 아래 예시가 훨씬 이해가 빠를 듯하다.
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"The first element is ${first()}," +
" the last element is ${last()}"
}
println(firstAndLast)
apply
- 객체 초기화
val adam = Person("Adam").apply {
age = 32
city = "London"
}
also
- 부가적인 action이 필요할 때
val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("The list elements before adding new one: $it") }
.add("four")
참고
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin in Action] 8장. 고차함수와 inline function (inline 함수의 장단점, 사용 이유 등) (0) | 2022.01.09 |
---|---|
[Kotlin in Action] 4장. 클래스, 객체, 인터페이스 (0) | 2021.11.03 |
[Kotlin in Action] 3장. 함수 정의와 호출 (0) | 2021.10.09 |
[Kotlin] static, object, companion object 차이 (1) | 2021.06.27 |
[Kotlin] Coroutine suspend function 은 대체 뭐야? (16) | 2021.06.13 |