[코틀린기초] 10. 코틀린 표준함수 let()

표준함수들은 확장 함수형태의 람다식으로 구성되어 있다.

let은 함수를 호출하는 객체 T를 이어지는 block의 인자로 넘기고 block의 결과값 R을 반환

다른 메서드를 실행하거나 연산을 수행해야 하는 경우에 사용한다.


public inline fun <T,R> T.let(block: (T) -> R) : R {... return block(this)}

return문의 this는 객체 T를 가리키는데, 람다식 결과 부분을 그대로 반환한다는 뜻.


fun main(){
  val score: Int? = 32
  
  fun checkScore(){
    if(score != null){
      println("Score: $score")
    }
  }
  
  fun checkScoreLet(){
    score?.let{println("Score: $it")} //세이프콜 형태로 호출
    val str = score.let{it.toString()} //score 자체를 let함수 안으로 복사하여 호출
    println(str)
  }
  
  checkScore()
  checkScoreLet()
}

let의 체이닝

fun main(){
  var a = 1
  var b = 2
  
  a = a.let{it+2}.let{ 
    println("a = $a") //이때 a는 아직 1이다.
    val i = it+b // i = 3 + 2  
    i
  }
  println(a) // 5
}

let의 중첩 사용

var x = "Kotlin!"
x.let{outer ->
  outer.let {inner ->
    println("Inner is $inner and outer is $outer") //it을 사용하지 않고 명시적 이름을 사용. 값이 복사되어 전달됨
  }
}



// 중첩된 let은 바깥쪽에 있는 것이 반환됨.

var x = "Kotlin"
x = x.let{outer ->
  outer.let{inner ->
    print("Inner is $inner and outer is $outer")
    "Inner String" //반환되지 않음
    }
    "Outer String" //이 문자열이 반환되어 x에 할당
  }
}

안드로이드에서 사용하는 예

val padding = TypedValue.applyDimension(
    TypeValue.COMPLEX_UNIT_DIP, 16f, resources.displayMetrics).toInt()

setPadding(padding,0,padding,0)

위와 같은 코드를 아래처럼 바꿀 수 있다.


TypeValue.applyDimension(TypeValue.COMPLEX_UNIT_DIP, 16f, resources.displayMetrics).toInt().let{
    setPadding(it,0,it,0)
}

null 검사할 때 let() 사용하기

let을 세이프 콜과 함께 사용하면 if(null != obj) 같은 검사부분을 대체할 수 있음


var obj: String?

obj?.let{
    Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show()
}

let을 사용한 경우 else문은 ?:로 대체 가능하다


val firstName: String?
var lastMane: String

firstName?.let{ print("$it $lastName")} ?: print("$lastName")