scope function
- 람다를 사용해 일시적인 영역을 만들고 코드를 더 간결하게 만들거나, method chaning에 활용하는 함수를 scope function이라고 한다
- let, run, also, apply는 scope function이면서 확장 함수이다
선요약
반환값 \ 수신객체 호출방식 | it 사용 | this 사용 |
람다의 결과 | let | run |
객체 그 자체 | also | apply |
with |
- let: 람다의 결과를 반환하고, let에 넘겨주는 람다에선 it을 사용한다
- run: 람다의 결과를 반환하고, run에 넘겨주는 람다에선 this를 사용한다
- also: 객체 그 자체를 반환하고, also에 넘겨주는 람다에선 it을 사용한다
- apply: 객체 그 자체를 반환하고, apply에 넘겨주는 람다에선 this를 사용한다
- with(파라미터, 람다): this를 사용해 접근하고 this는 생략 가능
- 외우지 말고 대략적으로 이해하고 필요할 때마다 찾아볼 것(+IDE 추천 기능 이용)
수신객체 호출방식 차이 (it vs this)
- let은 일반 함수를 받는다
- it: 생략이 불가능한 대신, 다른 이름 붙이기 O
- run은 확장 함수를 받는다
- this: 생략이 가능한 대신, 다른 이름 붙이기 X
- 확장함수에서는 본인 자신을 this로 호출하고 생략할 수 있기 때문이다
용례
// let
val value1 = person.let {
it.age //age 반환(람다의 결과가 반환)
}
// run
val value2 = person.run {
this.age //age 반환(람다의 결과가 반환)
}
// also
val value3 = person.also {
it.age //person 반환
}
// apply
val value4 = person.apply {
this.age //person 반환
}
// with
val person = Person("john", 20)
with(person) {
println(name)
println(this.age)
}
1. let
1) 하나 이상의 함수를 call chain 결과로 호출할 때
2) non-null 값에 대해서만 code block을 실행시킬 때
3) 일회성으로 제한된 영역에 지역 변수를 만들 때
2. run
객체 초기화와 반환 값의 계산을 동시에 해야 할 때(특히, 생성자가 길 때)
3. apply
객체 설정을 할 때에 객체를 수정하는 로직이 call chain 중간에 필요할 때
4. also
객체를 수정하는 로직이 call chain 중간에 필요할 때(apply와 유사)
5. with
특정 객체를 다른 객체로 변환해야 하는데, 모듈 간의 의존성에 의해 정적 팩토리 혹은 toClass 함수를 만들기 어려울 때
with를 사용하면 위와 같이 특정 객체의 프로퍼티를 참조할 때 object.prop1, object.prop2, ... 대신 prop1, prop2, ... 의 형태로 간결하게 작성할 수 있다.
참고
https://kotlinlang.org/docs/scope-functions.html#function-selection
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Java] JVM을 통해 알아보는 자바 프로그램 실행방식 (0) | 2022.12.15 |
---|---|
[Kotlin] BigDecimal을 비교할 때 주의하라 (0) | 2022.11.08 |
[Kotlin] 코틀린 유용한 함수 - padEnd (0) | 2022.07.19 |
[Kotlin] 코틀린에선 빌더 패턴(Builder Pattern) 대신 data class를 사용하라 (0) | 2022.06.22 |
[Java] Comparable과 Comparator (0) | 2022.04.27 |