Introduction
특징
Context Ojbect: this or it
class Person (var name: String, var age: Int)
fun main() {
val person = Person("홍길동", 30)
//this로 참조
person.run {
println("이름 : ${name}") //this.name과 동일
}
//it로 참조
person.let {
println("이름 : ${it.name}")
}
}
this
class Person (var name: String, var age: Int)
fun main() {
val person = Person("홍길동", 30)
//this로 참조
person.run {
println("이름 : ${this.name}")
}
}
it
class Person (var name: String, var age: Int)
fun main() {
val person = Person("홍길동", 30)
//it로 참조
person.let {
println("이름 : ${it.name}")
}
//전달 인자명 지정해서 참조
person.let { value ->
println("이름 : ${value.name}")
}
}
Return value
Context Object
val numberList = mutableListOf<Double>()
numberList.also { println("Populating the list") }
.apply {
add(2.71)
add(3.14)
add(1.0)
}
.also { println("Sorting the list") }
.sort()
fun getRandomInt(): Int {
return Random.nextInt(100).also {
writeToLog("getRandomInt() generated value $it")
}
val i = getRandomInt()
Lambda Result
val numbers = mutableListOf("one", "two", "three")
val addNumbersList = numbers.run {
add("four")
add("five")
}
Functions
let
객체 결과값에 하나 이상의 함수를 호출하는 경우 사용합니다.
/** let 안썼을 때 */
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
/** let 사용 시 */
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
// 추가적인 함수 호출 가능
}
null이 아닌 값으로만 코드블록을 실행시키고 싶을 때 자주 사용됩니다.
null이 아닌 객체에 대해 작업을 수행하려면 안전한 호출 연산자 ?.를 let에 사용하도록 합니다.
val str: String? = "Hello"
val length = str?.let { //안전한 호출 Safe Call
println("let() 호출 $it")
}
val numbers = mutableListOf("one", "two", "three", "four", "five")
val resultList = numbers.map { it.length }.filter { it > 3 }
println(resultList)
->
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let {
println(it)
// and more function calls if needed
}
with
with는 이미 생성된 Context Object 객체를 인자로 받아서 사용하는 것이 효율적일 때는 with를 사용하면 더 좋습니다.
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"첫번째 요소는 ${first() 입니다.}," +
"마지막 요소는 ${last() 입니다.}"
}
println(firstAndLast)
run
with와 비슷한 역할로, 이미 생성된 Context Object 객체를 사용할 때 호출하며 with와는 전달받는 위치가 다릅니다.
앞에 Safe Call(?.)을 붙여서 null 체크까지 할 수 있어서, with 보다는 run이 더 자주 사용됩니다.
/** 기본 코드 */
val point = Point()
val width = point.x * 0.5
/** run() 사용 코드 */
val width = run {
val point = Point()
point.x * 0.5
}
val point = Point()
val width = point.run {
x * 0.5
}
imageView.layoutParams.run {
width = 400
height = 200
}
apply
apply는 보통 객체 초기화 시에 가장 많이 사용됩니다.
val person = Person("홍길동").apply {
age = 30
}
also
also는 기존 객체를 수정하거나 변경하지 않고, 디버깅을 위한 로깅 등의 추가적인 부가 작업을 하려고 할 때 사용합니다.
val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("새 항목 추가하기 전 리스트 요소들: $it") }
.add("four")
(참조 블로그 : https://0391kjy.tistory.com/25)