-
[Kotlin] 범위 지정 함수 apply, let, run, also, with📖 개발 공부/kotlin 2023. 4. 8. 22:26
범위 지정 함수
람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위(block)가 형성되는데, 이 범위 내에서 객체에 대해 할 작업을 정의할 수 있다.
확장함수는 람다를 인자로 받아 동작하며, 확장함수를 실행하는 주체를 수신자 또는 수신자 객체라고 한다.
특정 객체에 대한 작업을 block 내에 표현하게 되면, 가독성이 증가하게 되고 코드가 더 깔끔해진다는 장점이 있다.
이 함수들은 2가지 구성 요소를 가진다.
- 수신 객체(receiver): 확장함수를 실행하는 주체
- 수신 객체 지정 람다(block; lambda with receiver): 범위 지정 함수
함수 간의 차이점
funtion object reference return value is extension function let it Lambda result Yes run this Lambda result Yes run - Lambda result No: called without the context object with this Lambda result No: takes the context object as an argument. apply this Context object Yes also it Context object Yes let
public inline fun <T, R> T.let(block: (T) -> R): R
- 지정된 값이 null이 아닌 경우에 코드를 안전하게 실행해야 하는 경우
- 람다 함수의 결과를 반환한다.
- it 키워드로 수신 객체에 접근한다.
apply
inline fun <T> T.apply(block: T.() -> Unit): T
- 수신 객체를 초기화하거나 설정하는 경우
- 수신 객체 자체를 반환한다.
- this 키워드로 수신 객체에 접근한다.
val peter = Person().apply { // apply 의 블록 에서는 오직 프로퍼티만 사용한다. name = "Jenny" age = 24 }
also
inline fun <T> T.also(block: (T) -> Unit): T
- 수신 객체 람다가 전달된 수신 객체를 전혀 사용하지 않거나 수신 객체의 속성을 변경하지 않고 사용하는 경우
- apply와 마찬가지로 수신 객체를 반환하므로 블록 함수가 다른 값을 반환해야하는 경우에는 also를 사용할 수 없다.
- 수신 객체 자체를 반환한다.
- it 키워드로 수신 객체에 접근한다.
예를 들어, 객체의 사이드이펙트를 확인하거나 수신 객체의 프로퍼티에 데이터를 할당하기 전에 해당 데이터의 유효성을 검사할 때 매우 유용하다.
class Book(author: Person) { val author = author.also { requireNotNull(it.age) print(it.name) } }
run
inline fun <R> run(block: () -> R): R inline fun <T, R> T.run(block: T.() -> R): R
- 어떤 값을 계산할 필요가 있거나 여러개의 지역 변수의 범위를 제한하는 경우
- 람다 함수의 결과를 반환한다.
- this 키워드로 수신 객체에 접근한다.
val inserted: Boolean = run { // person 과 personDao의 범위를 제한한다. val person: Person = getPerson() val personDao: PersonDao = getPersonDao() // 수행 결과 반환 personDao.insert(person) } fun printAge(person: Person) = person.run { // person 을 수신객체로 변환하여 age 값을 사용한다. print(age) }
with
inline fun <T, R> with(receiver: T, block: T.() -> R): R
- 람다 함수의 결과를 반환한다.
- 인자로 수신객체를 전달한다.
val person: Person = getPerson() with(person) { print(name) print(age) }
🔗 참고
반응형'📖 개발 공부 > kotlin' 카테고리의 다른 글
도메인 모델에 kotlin의 data class가 적합할까? (0) 2023.12.10 [Kotlin] @Synchronized 어노테이션 동작 방식 (0) 2023.08.03 [Kotlin] toBoolean(), toBooleanStrict() (0) 2023.07.26 [Kotlin] sortedBy와 sortedWith의 차이점 (0) 2023.04.09 [Kotlin] const와 val의 차이 (0) 2023.04.01