Do it! 코틀린 프로그래밍 [셋째마당, 코틀린 표준 라이브러리의 활용] 학습
표준함수는 람다식과 고차함수를 이용해 선언되어 있음
표준함수를 이용하면 코드를 더 단순화하고 읽기좋게 만들 수 있음
📌 클로저의 조건
fun main() {
val calc = Calc()
var result = 0 // 외부의 변수
calc.addNum(2, 3) { x, y -> result = x + y } // 클로저
println(result) // 값을 유지하여 5 출력
}
class Calc {
fun addNum(a: Int, b: Int, add: (Int, Int) -> Unit) {
add(a, b)
}
}
-> Calc클래스의 메서드인 addNum()이 호출되면 result는 자신의 유효범위를 벗어나 삭제되어야하지만 클로저의 개념에 의해 독립된 복사본을 가짐
📌 확장 함수의 람다식 접근 방법
함수 이름 | 람다식의 접근 방법 | 반환 방법 |
---|---|---|
T.let | it | block 결과 |
T.also | it | T caller (it) |
T.apply | this | T caller(this) |
T.run / run | this | block 결과 |
with | this | Unit |
📌 let()
함수
public inline fun <T, R> T.let(block: (T) -> R): R { ... return block (this)}
// (1)
val padding = TypedValue.applyDimension(
TypeValue.COMPLEX_UNIT_DIP, 16f, resources.displayMetrics).toInt()
setPadding(padding, 0, padding, 0)
// (2) let() 함수 사용 (변수 X)
val padding = TypedValue.applyDimension(
TypeValue.COMPLEX_UNIT_DIP, 16f, resources.displayMetrics).toInt().let {
setPadding(it, 0, it, 0)
}
-> (1)에서는 padding이 한번만 사용되면 변수 할당을 하느라 자원 낭비가 있을 수 있음
-> 이때 (2)와 같이 let()
을 통해 변수를 따로 할당하지 않는 방법을 사용할 수 있음
firstName?.let { print("$it $lastName") } ?: print("$lastName")
📌 also()
함수
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
var m = 1
m = m.also { it + 3 }
println(m) // 원본값 1
-> 연산 결과인 4가 할당되는 것이 아니라 it의 원래 값 1이 다시 m에 할당
fun main() {
data class Person(var name: String, var skills: String)
var person = Person("Kildong", "Kotlin")
val a = person.let {
it.skills = "Android"
"success"
}
println(a) // success
val b = person.also {
it.skills = "Java"
"success"
}
println(b) // Person("Kildong", "Java"
}
-> let() 함수는 마지막 표현식인 "success"를 a에 할당
-> also()는 마지막 표현식 "success"을 b가 아닌 person객체 자신에 할당
-> b는 Person의 객체 person을 반환하고 새로운 객체 b가 할당되어 만들어짐