티스토리 뷰
코틀린의 scope function
이란, 람다를 사용해서 일시적인 영역을 만들어 코드를 더 간결하게 하거나, method chaning
에 활용하는 함수를 말한다.
이번에는 코틀린의 scope function에 대해 알아보자!
1. scope function의 분류
2. 언제 어떤 scope function을 사용해야 할까?
scope function의 분류
let
과 run
은 람다의 결과를 반환하고, also
와 apply
는 객체 그 자체를 반환한다.
아래 예제코드를 살펴보면서 조금 더 쉽게 이해해보자.
val person = Person("김성현", 10)
// 반환 : age
val let = person.let {
it.age
}
val run = person.run {
this.age
}
// 반환 : person
val also = person.also {
it.age
}
val apply = person.apply {
this.age
}
println("let= $let")
println("run= $run")
println("also= $also")
println("apply= $apply")
결과
위 결과를 보면 예상한 것과 같이 let
과 run
은 함수의 결과를 반환하고, also
와 apply
는 객체를 반환하는 것을 확인할 수 있다.
코드를 보면 let
과 also
는 it
을 사용하고, run
과 apply
는 this
를 사용하는데,this
는 생략이 가능한 대신, 다른 이름을 붙일 수 없지만,it
은 생략이 불가능한 대신, 다른 이름을 붙일 수 있다는 차이가 있다.
let
은 파라미터로 일반 함수를 받고, run
은 확장함수를 받는다. 확장함수에서는 본인 자신을 this
로 호출하고, 생략이 가능하기 때문에 run
과 apply
에서 this
를 생략해도 문제가 없는 것이다.
val let = person.let { p ->
p.age
}
val run = person.run {
age
}
val also = person.also { p ->
p.age
}
val apply = person.apply {
age
}
언제 어떤 scope function을 사용해야 할까?
let
하나 이상의 함수를 call chain
결과로 호출할 때 사용하거나, non-null
값에 대해서만 code block
을 실행시킬 때 사용
//하나 이상의 함수를 `call chain` 결과로 호출
val strings = listOf("APPLE", "BANANA")
strings.map { it.length }
.filter { it > 3 }
.let(::println)
// non-null 값에 대해서만 code block 실행
// str이 null이 아니라면, 문자열 길이를 반환
val length = str?.let {
println(it.uppercase())
it.length
}
run
객체 초기화와 반환 값의 계산을 동시에 해야 할 때 사용
// 객체를 만들어 DB에 저장하고, 바로 그 객체를 활용
val person = Person("김성현", 10).run { memberRepository::save }
// 그렇지만.. 자바개발자에게 조금 더 익숙한 방식..
val person = personRepository.save(Person("김성현", 10))
apply
객체 설정 중, 객체를 수정하는 로직이 call chain
중간에 필요할 때 사용
val person = Person("김성현", 10)
person.apply { this.growOld() }
.let(println(it))
also
객체를 수정하는 로직이 call chain
중간에 필요 할 때 사용
mutableListOf("one", "two", "three")
.also { println("$it") }
.add("four")
정리
kotlin
의scope function
은 일시적인 영역을 만들어 코드를 더 간결하게 하거나,method chaning
에 활용한다.scope function
의 종류에는let
,run
,also
,apply
가 있다.
'Kotlin' 카테고리의 다른 글
[Kotlin] 리액티브 프로그래밍 & 리액티브 스트림 (0) | 2022.09.16 |
---|---|
[Kotlin] 비동기-논블로킹 프로그래밍 (0) | 2022.09.14 |
[Kotlin] 람다(lambda) (0) | 2022.06.22 |
[Kotlin] Collection (0) | 2022.06.19 |
[Kotlin] 클래스 (0) | 2022.06.17 |
- Total
- Today
- Yesterday
- 릿코드
- spring boot
- Algorithm
- MySQL
- leetcode
- 인프런
- 스프링부트
- 파이썬
- mysql 8.0
- 자료구조
- 노마드코더
- 스프링
- kotlin
- 리팩토링
- 구현
- 코테
- Spring
- 스프링 부트
- 데이터베이스
- webflux
- 알고리즘
- Real MySQL
- 코틀린
- 노마드
- 그리디
- 백준
- 북클럽
- 김영한
- 정렬
- 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |