본문 바로가기
Kotlin

[Kotlin] 코틀린 표준 라이브러리 let(), also(), apply(), run(), with() - (3)

by Taehyung Kim, dev 2020. 7. 22.
728x90

https://thkim-study.tistory.com/6 - let() 함수

https://thkim-study.tistory.com/7 - also() 함수

 

코틀린 표준 라이브러리 중 apply()를 알아보자.

 

apply()란 무엇인가

apply() 함수는 람다식 접근 방법이 this이고 반환 방법도 this이다. 또한 이전에 스터디했던 let(), also()와 다르게 람다식이 확장 함수로 처리된다.

간단한 예제를 통해 알아보자.

 

    data class Car(var name: String, var speed: Int)

    var car = Car("Sports Car", 100)
    car.apply { this.speed = 120 }
    println(car)

    val returnObj = car.apply {
        name = "Mini Car"
        speed = 30
    }
    println(car)
    println(returnObj)

실행 결과

Car(name=Sports Car, speed=120)
Car(name=Mini Car, speed=30)
Car(name=Mini Car, speed=30)

앞서 스터디했던 also() 함수와 다른점은 this로 객체를 받는다는 것이다. 또 다른 점은 apply()는 this를 생략할 수 있다.

 

 

run()이란 무엇인가

run() 함수는 람다식 접근 방법은 this이고 반환방법은 block 내용의 결과이다.

run() 함수의 특징은 익명함수와 객체 호출로, 2가지 방법으로 사용할 수 있다. 

아래 예제를 통해 알아보자.

 

    data class Car(var name: String, var speed: Int)

    var car = Car("Sports Car", 100)
    val returnObj = car.apply {
        this.name = "Mini Car"
        speed = 30
        "Done" // 사용되지 않는다.
    }
    println(car)
    println("returnObj: $returnObj")

    val returnObj2 = car.run {
        this.name = "SUV"
        speed = 80
        "SUV Done"
    }
    println(car)
    println("returnObj2: $returnObj2")

실행 결과

Car(name=Mini Car, speed=30)
returnObj: Car(name=Mini Car, speed=30)
Car(name=SUV, speed=80)
returnObj2: SUV Done

이처럼 run() 함수는 apply()함수와 다르게 객체를 반환하지 않고 마지막 표현식이 반환됨을 알 수 있다.

 

 

 

with() 란 무엇인가

with() 함수는 run() 함수와 유사하다. 다른 점은 with() 함수는 receiver로 전달할 객체를 처리하여 객체의 위치가 달라진다. 또한 with()는 세이프 콜(?.)을 지원하지 않아 let()함수와 같이 사용되기도 한다.

아래 예제를 통해 알아보자.

 

    data class Car(val name: String, var speed: Int, var blackBox: String? = null)

    val car = Car("Sports Car", 100)

    val result = with (car) {
        speed = 120
        blackBox = "YES"
    }

    println(car)
    println("result: $result")

실행 결과

Car(name=Sports Car, speed=120, blackBox=YES)
result: kotlin.Unit

 

with 함수에 인수를 넣고 block 내부에서 멤버 이름으로 직접 접근할 수 있다.

기본적으로 Unit이 반환되지만 block 내부 마지막 표현식을 작성하면 해당 표현식을 반환할 수도 있다.

 

 

 

 

728x90

댓글