코틀린에는 범위 지정 함수인 apply, with, let, also, run 이 있다.
람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위가 형성되고, 이 범위 내에선 이름 없이 객체에 접근할 수 있다.
하지만 하나의 코드 블럭에서 여러 범위 지정 함수가 중첩되면 가독성이 떨어지고 파악이 힘들어진다.
단, 중첩이 아닌 호출 체인으로 결합하면 코드의 가독성이 향상된다.
apply
수신 객체의 함수를 사용하지 않고, 수신 객체 자신만 다시 반환하려는 경우.
대표적인 경우는 객체의 초기화이다.
apply 사용
val user = User().apply{
name = "mj"
gender = "male"
}
apply 미사용
val user = User()
user.name = "mj"
user.gender = "male"
also
apply와 마찬가지로 수신 객체를 반환고, 블록 함수가 다른 값을 반환할 수 없다.
대표적인 경우는 객체의 사이드 이팩트를 확인하거나 데이터의 유효성 검사 진행
also 사용
class User(user: User){
val user = user.also{
print(it.name)
print(it.gender)
}
}
also 미사용
class User(val user: User){
init{
print(user.name)
print(user.gender)
}
}
let
지정된 값이 null이 아닌 경우 블록 실행.
Nullable 객체를 또 다른 Nullable 객체로 변환.
단일 지역 변수의 범위 제한.
let 사용
//1.
getNullableUserData()?.let{
regist(it)
}
//2.
val user: ?= getNullableUserData()?.let{
service.getGoldUser(it)
}
//3.
val user: User = getUser()
service().let{ userService ->
userService.regist(user)
}
let 미사용
//1.
val user: User ?= getUser()
if(user != null){
regist(user)
}
//2.
val user: User ?= getUser()
val goldUser: GoldMember ?= if(user == null) null else service.getGoldUser(it)
//3.
val user: User = getUser()
val service: UserService = getUserService()
service.regist(user)
With
Null이 될 수 없는 수신 객체고 결과가 필요 없는 경우에 사용.
with 사용
val user: User = getUser()
with(user){
print(name)
print(gender)
}
with 미사용
val user: User = getUser()
print(user.name)
print(user.gender)
Run
- 특정 값을 계산하거나 여러개의 지역 변수의 범위를 제한할 때 사용
- 매개 변수로 받은 명시적 수신객체를 암시적 수신 객체로 변환할 때 사용
run 사용
val isSuccess: Boolean = run {
val user: User = getUser()
val service: UserService = getUserService()
//수행 결과 반환
service.regist(user)
}
fun printUserInfo(user: User) = user.run{
//user를 수신객체로 변환하여 값 사용
print(name)
print(gender)
}
run 미사용
val user: User = getUser()
val service: UserService = getUserService()
val isSuccess: Boolean = service.regist(user)
fun printUserInfo(user: User) = {
print(user.name)
print(user.gender)
}
'Kotlin' 카테고리의 다른 글
[Kotlin] Flow (0) | 2021.08.13 |
---|---|
[Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교 (0) | 2021.08.04 |
[Kotlin] 커링(Currying) 함수 (0) | 2021.08.03 |
[Kotlin] Tailrec (0) | 2021.08.02 |
[Kotlin] Sealed Class (0) | 2021.07.30 |