와챠의 우당탕탕 코딩 일기장
[Kotlin]let/with/run/apply/also 본문
반응형
- let
- with
- run
- apply
- also
0. 기본
기본적인 객체 생성 방법은 아래와 같다.
// 사람 데이터 클래스
data class Person(var name: String, var age: Int)
// 객체 생성
val person = Person("", 0)
person.name = "minWachya"
person.age = 23
// 출력
println("$person") // Person(name=minWachya, age=23)
1. let
fun <T, R> T.let(block: (T) -> R): R
- 자신(it)을 받아서 어떤 값을 반환함.
- let 블럭 안에는 non-null 값만 가능
// 객체 생성
val person = Person("", 0)
// 경우 1: 자기 자신 반환
val result1 = person.let {
it.name = "minWachya"
it.age = 23
it // 반환값
}
// 경우1 출력
println("$result1") // Person(name=minWachya, age=23)
//--------------------------------------
// 경우2: 문자열 반환
val result2 = person.let {
it.name = "minWachya"
it.age = 23
"{$name is $age}" // 반환값
}
// 경우2 출력
println("$result2") // minWachya is 23
//--------------------------------------
// 경우3: 반환값 없음
val result3 = person.let {
it.name = "minWachya"
it.age = 23
}
// 경우3 출력
println("$result2") // kotlin.Unit
2. with
fun <T, R> with(receiver: T, block: T.() -> R): R
- non-null의 객체를 입력받아 블럭에서 그 객체를 사용함
// 객체 생성
val person = Person("minWachya", 23)
with(person) {
println(name) // minWachya
println(age) // 23
// 주로 반환값 없음
// 자기자신을 반환 시: this! // it 아님
}
3. run
1,
fun <T, R> T.run(block: T.() -> R): R
- 어떤 값을 계산할 때
- 여러 개의 지역변수 범위를 제한할 때 사용
val person = Person("minWachya", 23)
val addAge = person.run {
++age
}
println("$addAge") // 24
2,
fun <R> run(block: () -> R): R
- 객체 생성 명령문을 블럭 안에 묶음으로써 가독성을 높이는 역할
val person = run {
val name = "minWachya"
val age = 23
Person(name, age) // 반환값
}
4. apply
fun <T> T.apply(block: T.() -> Unit): T
- 자기 자신 반환
- 객체의 초기화/변경 시에 사용
// 객체 생성
val person = Person("", 0)
val result = person.apply {
name = "minWachya"
age = 23
}
// 출력
println("$person") //Person(name=minWachya, age=23)
5. also
fun <T> T.also(block: (T) -> Unit): T
- 자기 자신 반환
- it 사용
- 객체의 속성을 사용/변경하지 않는 사용하는 경우에 사용
- 객체의 데이터 유효성을 확인하거나, 디버그, 로깅 등의 부가적인 목적으로 사용할 때에 적합
// 객체 생성
val person = Person("", 0)
val result = person.also {
it.name = "minWachya"
it.age = 23
}
// 출력
println("$person") //Person(name=minWachya, age=23)
참고
- https://kotlinlang.org/docs/scope-functions.html#return-value
- https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
그동안 Android Studio 쓰면서 많이 보던 것들인데... 차이를 정확히 모르겠어서 정리해봤다.
이렇게 정리해봤는데도 알쏭달쏨...^
반응형
'코딩 일기장 > Android(Kotlin)' 카테고리의 다른 글
[Android/Kotlin]BottomSheetDialog/round corner/아래에 뜨는 다이얼로그로 선택하는 스피너 (0) | 2022.02.19 |
---|---|
[Android/Kotlin]Spinner hint/Spinner underline (0) | 2022.02.18 |
[Android/Kotlin]코루틴(Coroutine) 정리 (0) | 2022.02.07 |
갤러리에서 가져온 이미지가 회전되어져 있을 때(ExifInterface) (0) | 2022.01.31 |
Spinner 설정 (0) | 2022.01.25 |
Comments