티스토리 뷰
본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!
코틀린 코드를 접할 때 생소한 코드가 정말 많았지만 그 중에서도 가장 눈에 띄던 것은 run( )이나 apply( ), let( )과 같은 익숙한 영어 단어로 되어 있는 함수들이 독특한 형태로 사용되고 있는게 신기해보였다.
(지금와서야 알게 된건 이런 함수들이 고차함수였다는 사실...)
지금은 어떻게 사용되는지 알게 되었지만 아직 익숙하다고 말할수는 없으니 한 번 정리해보도록 하자.
1. run( )
run( ) 함수는 두 가지 형태로 사용된다.
- 단순히 람다 함수를 실행하고 그 결괏값을 얻는 목적으로 사용
- 객체의 멤버에 대한 접근하기 위해 사용
1-1. 람다 함수 실행 목적의 run( )
API 문서
inline fun <R> run(block: () -> R): R
예시)
val result = run {
println("lambdas function call..")
30 + 50
}
println("result : $result") // result가 30 + 50의 결과인 80이 출력된다.
사용규칙
- 어떤 값을 계산할 필요가 있거나 여러 개의 지역 변수의 범위를 제한할 때
1-2. 객체 멤버 접근을 위한 run( )
API 문서
inline fun <T, R> T.run(block: T.() -> R): R
예시)
class User() {
var name: String? = null
var age: Int? = null
fun sayHello() {
println("hello $name")
}
fun sayInfo() {
println("i am $name, i`m $age years old")
}
}
val runResult = user.run {
name = "weekyear"
age = 28
sayHello()
sayInfo()
10 + 18
}
println("run result : $runResult") // 마찬가ㅁ지로 마지막 줄의 값을 반환한다.
사용규칙
- 객체에 포함된 함수를 실행하고 그 결과를 반환할 때 사용한다.
2. apply( )
apply( ) 함수는 run( ) 함수와 사용 목적은 같은데 반환하는 값에 차이가 있다. run( ) 함수는 전달받은 람다 함수의 반환값을 반환하지만 apply( ) 함수는 apply( )를 호출한 객체를 반환한다.
API 문서
inline fun <T> T.apply(block: T.() -> Unit): T
예시)
val user2 = user.apply {
name = "jeong"
age = '29'
}
- user와 user2는 변수명만 다를 뿐이고 같은 객체를 참조하고 있다.
사용 규칙
- 람다 내부에서 호출 객체의 함수를 사용하지 않고 호출 객체를 반환하는 경우
- 주로 객체 초기화에 활용한다.
3. let( )
let( ) 함수는 자신을 호출한 객체를 매개변수로 전달받은 람다 함수에 매개변수로 전달하는 함수이다.
반환값으로 람다 함수의 결과값을 출력한다.
API 문서
inline fun <T, R> T.let(block: (T) -> R): R
예시)
User("weekyear", 28).let { user ->
sayInfo(user)
}
User("jeong", 29).let {
sayInfo(it)
} // 매개변수가 호출한 객체에 해당하는 user 하나 뿐이므로 it으로 사용 가능하다.
사용 규칙
- Null 체크 후 코드를 실행하고 싶은 경우에 사용
- 짧게 이용하기 위한 변수 선언을 줄이고자 할 때 사용
4. with( )
run ( ) 함수와 사용 목적이 유사하다. 한 객체의 멤버에 반복해서 접근할 때 객체 명을 일일이 명시하지 않고 멤버에 바로 접근하려는 용도로 사용된다.
with ( ) 함수는 매개변수로 지정한 객체를 이용한다.
API 문서
inline fun <T, R> with(receiver: T, block: T.() -> R): R
예시)
with(user) {
name = "weekyear"
sayInfo()
}
사용 규칙
- Non-nullable 객체여야 함.
- 결과가 필요하지 않는 경우에 자주 사용
5. also( )
호출 객체를 람다 함수가 매개변수로 받고 결괏값으로 호출 객체를 반환한다.
API 문서
inline fun <T> T.also(block: (T) -> Unit): T
예시
val user = User("weekyear", 28).also {
println("my name is $it.name, i am $it.age years old")
}
사용 규칙
- 람다 함수가 호출 객체를 전혀 사용하지 않거나 호출 객체의 속성을 변경하지 않고 사용하는 경우 사용
- 로그를 출력하거나 값의 유효성을 검증하고 싶을 때 자주 사용한다.
최종 정리
함수 | 객체 참조 방식 | 반환값 | 확장 함수 여부 |
run | this (암시적) | 람다함수 결괏값 | O |
run | - | 람다함수 결괏값 | X : 호출 객체 없이 호출함 |
apply | this (암시적) | 호출 객체 | O |
let | it (명시적) | 람다함수 결괏값 | O |
with | this (암시적) | 람다함수 결괏값 | X : 호출 객체를 인자로 받음 |
also | it (명시적 | 호출 객체 | O |
참조
https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
https://jepark-diary.tistory.com/69
https://selfish-developer.com/entry/%EC%BD%94%ED%8B%80%EB%A6%B0-apply-also-let-run-with
https://dongsik93.github.io/til/2020/05/19/til-kotlin-scoping-function/
'Programming > 코틀린(Kotlin)' 카테고리의 다른 글
[코틀린] 14. 컬렉션 타입과 람다 - 2. 필터링 함수, 3. 매핑 함수 (0) | 2021.05.02 |
---|---|
[코틀린] 14. 컬렉션 타입과 람다 - 1. 집합 연산 함수 (0) | 2021.05.02 |
[코틀린] Object 클래스 (feat. 깡샘) (0) | 2021.04.25 |
[코틀린] 10. 추상 클래스와 인터페이스 (feat. 깡샘) (0) | 2021.04.12 |
추상 클래스와 인터페이스의 사용 목적 (0) | 2021.04.12 |