ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] also, apply, let, run
    코틀린 2022. 3. 20. 21:16

    코틀린의 Any 객체에는 다양한 메소드가 정의되어있다. 그 중 also, apply, let, run에 대해서 살펴본다. 

     

    1. also

    also는 block을 받아 실행시키고 block의 argument는 실행 컨텍스트가 된다. also 내부의 this 값은 람다가 정의된 곳의 this 다. block 실행 결과는 원래 context가 반환된다.

    fun toString() = "lexical"
    val doAlso = "context".also { arg -> print("this: ${this.toString()}, arg: $arg, ") }
    println("result $doAlso") 
    
    // 출력 this: lexical, arg: context, result context

     

    2. apply

    apply도 block을 받아 실행시킨다. apply의 블록은 arg를 받지 않도록 되어있다. 블록 내부의 this는 context를 가리키고 실행 결과는 원래 컨텍스트가 반환된다.

    val doApply = "context".apply { print("this: $this ") }
    println("result $doApply")
    // 출력 this: context result context

     

    3. let

    let의 block은 arg로 컨텍스트를 받아 결과를 반환한다. 이때의 this는 람다가 생성된 곳을 나타낸다. 앞의 apply, also와 다른 점은 블록의 결과가 반환된다는 점이다.

    val doLet = "context".let { arg -> print("this: ${this.toString()}, arg: $arg, ") }
    println("result $doLet")
    // 출력 this: lexical, arg: context, result kotlin.Unit

     

    4. run

    run의 block은 argument를 받지 않고 그 결과값을 반환한다. this는 람다가 생성된 부분의 this이고 block에서 리턴한 값이 전체 결과값이다.

    val doRun = "context".run { print("this: $this ") }
    println("result $doRun")
    
    // 출력결과 this: context result kotlin.Unit

     

    5. 활용

    apply는 아래와 같이 반복적인 참조가 필요한 부분에 사용할 수 있다.

    class Computer {
        var status = "off"
        var battery = 100
    
        fun turnOn() {
            println("turn on")
            status = "on"
        }
    
        fun turnOff() {
            println("turn off")
            status = "off"
        }
    
        fun doSomthing() {
            println("doSomthing")
        }
    
        fun batteryCharge() {
            println("battery charge")
            battery = 100
        }
    
        override fun toString(): String {
            return "status: $status battery: $battery"
        }
    }
    
    val computer = Computer()
    computer.turnOn()
    computer.doSomthing()
    computer.batteryCharge()
    // 아래로 변형 가능
    computer.apply { turnOn() }.apply{ doSomthing() }.apply { batteryCharge() }
    // 아래로 변형 가능
    computer.apply {
        turnOn()
        doSomthing()
        batteryCharge()
    }
    
    // 위의 출력들은 아래와 같다
    turn on
    doSomthing
    battery charge
    status: on battery: 100

    마지막 결과가 필요 없는 경우에는 run으로 사용할 수도 있다.

    computer.run {
        turnOn()
        doSomthing()
        batteryCharge()
    }
    // 출력
    turn on
    doSomthing
    battery charge

     

    let의 활용 let은 인자로 컨텍스트를 받고 실행 결과를 반환한다. 이를 이용하면 아래처럼 객체 생성 후 원하는 작업을 한 뒤 결과를 저장할 수 있다.

    fun createComputer(): Computer {
        return Computer()
    }
    
    fun Computer.calculate(): Boolean = true
    
    val calculateResult = createComputer()
        .let { computer -> computer.calculate() }
    
    println(calculateResult) // true

     

    '코틀린' 카테고리의 다른 글

    [코틀린] 확장함수와 확장속성  (0) 2022.03.20
    [코틀린] 연산자 오버로딩  (0) 2022.03.20
    [코틀린] 내부 반복(map, filter, groupBy, reduce)  (0) 2022.03.19
    [코틀린] 람다  (0) 2022.03.19
    [코틀린] 델리게이션  (0) 2022.03.16

    댓글

Designed by Tistory.