[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
[코틀린 더 알아보기]