개발일지

Kotlin in A..Z - 범위 지정 함수 본문

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
Comments