scope 함수의 종류는 많지만 각 종류별로 적절한 쓰임을 모르고 사용하는 경우가 굉장히 많다.
각 함수를 적절하게 사용하기 위해서 각 함수들이 어떻게 다른지에 대해서 공부할 필요성이 있다.
Scope Functions(스코프 함수)
특정 개체의 콘텍스트 내에서 특정 동작을 실행하기 위한 목적만을 가진 함수
객체의 이름에 일일히 접근할 필요가 없다는 것이 장점이다.
종류로는 apply
,run
,with
,also
,let
이 있다.
apply
인스턴스를 생성하고 , 특정 변수에 할당하기 전에 초기화 작업을 해준다.
모든 명령이 수행되면 명령이 적용되고 새로운 인스턴스를 반환해 줍니다.
즉 자기 자신을 반환합니다.
Jaehan이라는 변수를 생성하면서 age와 salary에 대한 수정을 적용할 수 있습니다.
apply 함수의 특징은 this를 사용할 수 있어서 아래와 같이 수정할 수 있습니다.
run
이미 만들어진 인스턴스의 값 혹은 그를 이용한 특정결과가 필요한 경우 사용한다.
apply와 마찬가지로 this를 사용할 수 있고,
apply와의 차이점은 apply의 반환값은 해당 객체이고, run의 반환값은 스코프 내 마지막 행이다.
마지막 행을 반환하기 때문에 월급에 해당하는 값이 출력되는 것을 알 수 있다.
그렇다면 jaehan의 상태는 변화할까?
run을 통해서 입력한 변화들이 Jaehan에 적용된 것을 알 수 있다.
With
- run과 동작이 유사하다.
- 람다 리턴 값이 필요하지 않을 경우 주로 사용한다.
- this를 사용해서 접근할 수 있다.
also
- apply와 유사하게 반환 값이 객체이다.
- this가 아닌 it을 사용해서 프로퍼티에 접근할 수 있다.
- 로깅이나 디버그 정보를 출력하는 것과 같이 객체를 변화시키지 않는 작업에 적합하다
let
- it을 사용해서 프로퍼티에 접근한다.
- 반환결과는 람다의 결괏값이다.
- 세이프콜을 이용해서 객체가 null 경우 따로 처리해 줄 수 있다.
val str: String? = null
val length = str?.let {
println("let() called on $it")
println(it) // OK: 'it' is not null inside '?.let { }'
it.length
}
str이 null 일경우는 let의 동작을 실행하지 않습니다.
하지만 아래와 같은 경우는
val str: String? = "Hello"
val length = str?.let {
println("let() called on $it")
println(it)
it.length
}
과 같은 출력 결과를 볼 수 있습니다.
즉 str이 null인 경우와 null 아닌 경우를 구분해서 적용할 수 있습니다.
요약을 하자면 다음과 같습니다.
이름 | 프로퍼티 접근 방법 | 반환 값 |
let | it | Lambda result |
also | it | Context object(it) |
apply | this | Context object |
run | this | Lambda result |
also | it | Context object |
with | this | Lambda result |
각 함수의 사용 목적
- let : null이 아닌 객체에서 람다 실행
- let : 지역 범위에서 변수로 표현식 사용
- apply : 객체 초기화
- run : 객체 초기화 및 결과 계산
- run : 표현식이 필요한 명령문 실행
- also : 추가 효과
- with : 객체에 대한 그룹화 함수 호출
해당 함수들을 반드시 사용할 필요는 없지만, scope 함수를 사용하면 확실히 코드가 간결해지고
가독성이 높아지는 것 같습니다.
코드리뷰에서도 피드백을 받은 것처럼 apply와 run을 구별해서 사용하는 것처럼 적절한 경우에 적절한 scope함수를 사용하는 것이 정말 중요하다고 생각한다.
참고
https://kotlinlang.org/docs/scope-functions.html#distinctions
https://mycool0905.github.io/kotlin/2020/12/15/kotlin-scope-function.html
https://sabarada.tistory.com/172
'Skils > Kotlin' 카테고리의 다른 글
[Kotlin] - 순열, 조합, 중복순열, 중복조합 (0) | 2023.10.31 |
---|---|
[Kotlin] - Collection (0) | 2023.10.15 |
[Kotlin]-정규표현식 (0) | 2023.08.10 |
[Kotlin] - 코루틴 (0) | 2023.03.05 |
[Kotlin] 고차 함수와 함수타입 (0) | 2022.09.14 |