Kotlin

[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()itR (블록 안의 실행 결과를 리턴)
T.also()itT (블록 안의 실행결과와 상관없이 T를 피턴)
T.run()thisR
run()thisR
with(T)thisUnit
T.apply()thisR

[REFERENCE]

kotlinlang.org/docs/reference/scope-functions.html#scope-functions

[코틀린 더 알아보기]

Leave a Reply

error: Content is protected !!