[android : kotlin] 코틀린 .let 사용법 예제 및 총정리 : 스코프 함수(Scope Functions)
코틀린 .let 사용법
let와 같은 스코프함수는 람다식을 사용합니다. 중괄호{}로 묶어서 사용하게 됩니다. 중괄호 안에서 임시 범위가 형성됩니다. 이 범위에서는 이름없이 객체에 접근 할 수 있어요. 그럼 왜쓸까요? 코딩시 편의 기능이라고 생각하면 이해가 빠릅니다. null값 체크도 할 수 있습니다. 아래 예제 코드들의 실행결과를 참고하세요.
let 은 T의 확장함수이고, R을 반환합니다. let의 정의된 코드를 보면 T를 받아서 R로 반환처리합니다. 쉽게 얘기하면 let은 람다식내의 결과를 리턴합니다. run, with 스코프함수에 이에 해당합니다.
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
그럼 시작해 볼까요? 데이터를 담아둘 때 사용하는 벨류오브젝트 클래스를 생성하게 됩니다. 그리고 기본적으로 아래 코드스니펫과 같은 방식으로 데이터를 변경하거나 가져와서 처리를 하게 됩니다.
data class Person (var name: String, var age: Int, var sex: String)
fun main() {
val alice = Person("Alice", 20, "F")
println(alice)
alice.name ="IU"
alice.age = 22
println(alice)
}
[실행결과]
Person(name=Alice, age=20, sex=F) Person(name=IU, age=22, sex=F)
위 코드스니펫의 코드를 스코프 함수 let를 사용하여 처리하여봅니다.
data class Person (var name: String, var age: Int, var sex: String)
fun main() {
//예제1
val alice = Person("Alice", 20, "F")
println(alice)
alice.let {
it.name = "IU"
it.age =22
}
println(alice)
Person("Alice", 20, "F").let {
it.name = "IU2"
it.age = 23
println("${it.name}")
}
}
[실행결과]
Person(name=Alice, age=20, sex=F) Person(name=IU, age=22, sex=F) IU2
다른 예제 코드들도 함께 살펴보세요.
fun main() {
//예제2
val first = listOf(1,2,3).first()
val sum = first + first
println("${sum}")
val sum2 = listOf(1, 2, 3).first().let{
it + it
}
println("${sum2}")
val sum3 = listOf(1, 2, 3).let{
println("Index 1 : ${it[0]}")
it[0] + it[1]
}
println("${sum3}")
}
[실행결과]
2 2 Index 1 : 1 3
let과 also의 비교 코드 스니펫
fun main() {
var stringVariable = "You can edit, run, and share this code. "
var stringVariable2 = "You can edit, run, and share this code. "
var temp1 = stringVariable.let {
println("length : ${it.length}")
it.reversed()
}
println("let 결과값-> temp1 : ${temp1}")
var temp2 = stringVariable2.also {
it.reversed()
}
println("also 결과값-> temp2 : ${temp2}")
}
[실행결과]
length : 40 let 결과값-> temp1 : .edoc siht erahs dna ,nur ,tide nac uoY also 결과값-> temp2 : You can edit, run, and share this code.
null이 아닌 경우에만 동작하도록 하는 경우에도 사용합니다.
fun main() {
val str: String? = "You can edit, run, and share this code. "
val length = str?.let {
println("$it")
it.length
}
println("str ->length : ${length}")
//널일경우
val str2: String? = null
val length2 = str2?.let {
println("$it")
it.length
}
println("str2 ->length : ${length2}")
}
[실행결과]
You can edit, run, and share this code. str ->length : 40 str2 ->length : null
■ 스코프함수 정리
| 스코프 함수 | 블록내 argument ( 중괄호 안{} ) | 리턴 값 |
| T.let() | it | R (블록 안의 실행 결과를 리턴) |
| T.also() | it | T (블록 안의 실행결과와 상관없이 T를 피턴) |
| T.run() | this | R |
| run() | this | R |
| with(T) | this | Unit |
| T.apply() | this | R |
[REFERENCE]
kotlinlang.org/docs/reference/scope-functions.html#scope-functions
[코틀린 더 알아보기]

