티스토리 뷰
공식문서 : Scope functions
영역함수란?
kotlin 표준 라이브러리가 제공하는 객체의 컨텍스트 안에서 코드 블럭을 실행할 목적으로 만든 함수.
구분 기준
(1) 객체 참조 방식 (블럭문 안에서)
=> this에 바인딩 (this 키워드 생략가능) vs lambda argument로 전달받기 (implicit default name인 it으로 쓰거나 custom name도 가능)
(2) 리턴 값 => 람다식 결과 값 (계산된 값이 없으면 Unit 이든가) vs 객체 (체이닝 가능)
+ 확장함수 여부 => with는 다른 함수들처럼 (객체).apply { block } 이렇게 쓰지 않고 with(객체) {block} 이렇게 context 객체를 람다식에 argument로 전달한다.
그래서 종류가 2*2+1 = 5 개...
하나씩 살펴보기
let
=> 객체 참조 : 람다 argument (it) / 리턴값: 람다 결과 값
사용처
- 임시 변수를 사용하는 대신 블럭문 안의 local scope 에서 객체를 it (혹은 다른 argument name)으로 참조하면서 추가 작업 진행
- ?. (안전호출 연산자)와 함께 사용해서 null이 아닌 객체 에 대해서만 코드 블럭 안의 내용을 실행하고 싶을때, 그리고 추가로 ?: (엘비스 연산자)와 함께 사용해서 최종 결과값이 null이 아니도록 한다.
fun processNullableString(str: String?) =
str?.let {
when {
it.isEmpty() -> "Empty"
it.isBlank() -> "Blank"
else -> it.capitalize()
}
} ?: "Null"
also
=> 객체 참조 : it / 리턴 값 : context object
사용처
- also를 적용한 후 리턴값이 계속 해당 객체인 속성을 활용해서 체이닝으로 부수 효과를 생성하고 싶을 때 사용.
also 코드를 만나면 이렇게 해석하면 좋다 "and also do the following with the object"
val numbers = mutableListOf("one", "two", "three")
numbers
.also { num -> println("The list elements before adding new one: $num") }
.add("four")
//The list elements before adding new one: [one, two, three]
run
=> 객체 참조 : this / 리턴 값 : lambda result
사용처
- 객체에 대해 configuration 할때. (그리고 리턴 값으로 그 객체가 필요 없을 때)
val service = MultiportService("https://example.kotlinlang.org", 80)
val result = service.run {
port = 8080
query(prepareRequest() + " to port $port")
}
- 객체랑 상관없는 Non-extension run으로 쓸수도 있다. 그냥 클로저 같이 쓰는건가...?
val hexNumberRegex = run {
val digits = "0-9"
val hexDigits = "A-Fa-f"
val sign = "+-"
Regex("[$sign]?[$digits$hexDigits]+")
}
with
=> 객체 참조 : this / 리턴 값 : lambda result / non-extension function
with 코드는 이렇게 해석될 수 있다 "with this object, do the following"
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
apply
=> 객체 참조 : this / 리턴 값 : context object
사용처
- 객체 configuration, 그리고 결과값은 그 configuration이 적용된 객체다.
apply 코드를 만나면 이렇게 해석하면 좋다 "apply the following assignments to the object"
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
//Person(name=Adam, age=32, city=London)
여기서 써둔 사용처는 공식 문서에서 소개해 둔 것을 정리한 거고 사실상 그냥 각자 함수 특징 생각해서 필요에 맞게 사용하면 된다.
'조각글' 카테고리의 다른 글
SDKMAN (0) | 2023.10.08 |
---|---|
golang 모듈 (0) | 2023.04.05 |
devops 따라하기 시리즈 (0) | 2022.03.22 |
git 빠르게 시작하기 2 (내부 구조) (0) | 2021.02.26 |
git 빠르게 시작하기 (0) | 2021.02.21 |