Kotlin (코틀린)
Kotlin in A..Z - 범위 지정 함수
강태종
2020. 7. 27. 04:39
also
- 해당 객체를 사용하기 전에 데이터의 유효성을 검사할 때 매우 유용하다.
선언
fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
코드
class Animal {
var name: String = "Animal"
var age: Int = 0
override fun toString(): String {
return "Name : $name, Age : $age"
}
}
fun isDog(animal: Animal) {
assert(animal.name == "Dog")
}
fun main() {
val dog = Animal().also {
isDog(it)
}
}
apply
- 특정 객체를 생성하면서 동시에 초기화를 할 때 사용한다.
- 객체가 반복되면서 사용될 때 코드의 양을 줄일 수 있다.
선언
inline fun <T> T.apply(block: T.() -> Unit): T
코드
class Animal {
lateinit var name: String
var age: Int = 0
override fun toString(): String {
return "Name : $name, Age : $age"
}
}
fun main() {
val animal = Animal().apply {
name = "Dog"
age = 5
}
println(animal)
}
결과
Name : Dog, Age : 5
let
- 해당 객체가 null이 아닐 경우에만 실행하고 싶은 경우
- 블록 단위의 변수를 사용하고 싶은 경우
- 블록의 값을 반환한다.
선언
inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
코드
class Animal {
var name: String = "Animal"
var age: Int = 0
override fun toString(): String {
return "Name : $name, Age : $age"
}
}
fun main() {
var nullAnimal : Animal? = null
nullAnimal?.let {
println(it)
}
var animal = Animal()
var returnValue = animal.let {
println(it)
5
}
println(returnValue)
}
결과
Name : Animal, Age : 0
5
run
- 블록단위 반환값을 가진다
- 블록 단위의 변수가 필요할 경우
- 이미 생성된 객체의 메서드나 프로퍼티를 연속으로 호출할 때
선언
inline fun <R> run(block: () -> R): R
inline fun <T, R> T.run(block: T.() -> R): R
코드
class Animal {
var name: String = "Animal"
var age: Int = 0
override fun toString(): String {
return "Name : $name, Age : $age"
}
}
fun main() {
var add = run {
val a = 2
val b = 3
a + b
}
println(add)
var animal = Animal().apply {
name = "Hello"
age = 15
}
var result = animal.run {
println("Info : $this")
println("Name : $name")
println("Age : $age")
true
}
println(result)
}
결과
5
Info : Name : Hello, Age : 15
Name : Hello
Age : 15
true
with
- run과 비슷하지만 반환값이 없다.
선언
inline fun <T, R> with(receiver: T, block: T.() -> R): R
코드
class Animal {
var name: String = "Animal"
var age: Int = 0
override fun toString(): String {
return "Name : $name, Age : $age"
}
}
fun main() {
val animal = Animal()
with(animal) {
println("Name : $name")
println("Age : $age")
}
}
Name : Animal
Age : 0