Kotlin에서 사용되는 함수 중에 범위 지정 함수라는게 있습니다. 이 함수들은 비슷한 모습을 하고 있어서, 약간의 혼란을 불러 일으키는 것 같습니다. 그러므로 이번 글에서는 이 범위 지정 함수들을 정리해보겠습니다.

apply, with, let, also, run은 전달받는 인자와 작동 방식, 결과가 매우 비슷하다. 이 5개는 범위 지정 함수라고 명칭한다.

이 함수들은 공통적으로 두가지 구성 요소를 가진다.

with의 정의

  inline fun <T, R> with(receiver: T, block: T.() -> R): R {
      return receiver.block()
  }

receiver는 수신 객체이고, block은 수신 객체 지정 람다이다.

수신 객체가 매개 변수 T로 제공된다. 이것을 명시적으로 제공된 수신 객체라고 한다.

수신 객체 지정 람다가 T의 확장함수 형태로 코드 블록 내에 수신 객체가 암시적으로 전달 된다.

최종적인 반환 값 : 람다를 실행한 결과를 반환한다.

  • 확장함수란?

    확장 하려는 대상에 함수를 추가하는 것이다. 예시,

      fun main(args: Array<String>{
          println("Hello".whatIsLonggerString("Hi"))
      }
    
      fun String.whatIsLonggerString(x: String) : String {
          return if(this.length > x.length) this else x
      }
    
      //결과값 : Hello
    
      //즉 여기서 "Hello"는 확장 하려는 대상이고, whatIsLonggerString(String)은 확장 함수명이다.
    

also의 정의

  inline fun <T> T.also(block: (T) -> Unit): T {
      block(this)
      return this
  }

T(수신 객체)의 확장함수로 수신 객체가 암시적으로 제공 된다.

수신 객체 지정 람다에 매개 변수 T로 코드 블록 내에 명시적으로 전달 된다.

최종적인 반환 값 : 코드 블록 내에 전달된 수식객체를 그대로 다시 반환 한다.

apply의 정의

  inline fun <T> T.apply(block: T.() -> Unit): T {
      block()
      return this
  }

T(수신 객체)의 확장함수로 수신 객체가 암시적으로 제공 된다.

수신 객체 지정 람다가 T의 확장함수 형태로 코드 블록 내에 수신 객체가 암시적으로 전달 된다.

최종적인 반환 값 : 코드 블록 내에 전달된 수신객체를 그대로 다시 반환 한다.

let의 정의

  inline fun <T, R> T.let(block: (T) -> R): R {
      return block(this)
  }

T(수신 객체)의 확장함수로 수신 객체가 암시적으로 제공 된다.

수신 객체 지정 람다에 매개 변수 T로 코드 블록 내에 명시적으로 전달 된다.

최종적인 반환 값 : 람다를 실행한 결과를 반환한다.

run의 정의

  inline fun <T, R> T.run(block: T.() -> R): R {
      return block()
  }

T(수신 객체)의 확장함수로 수신 객체가 암시적으로 제공 된다.

수신 객체 지정 람다가 T의 확장함수 형태로 코드 블록 내에 수신 객체가 암시적으로 전달 된다.

최종적인 반환 값 : 람다를 실행한 결과를 반환한다.

정리

5개의 범위 지정 함수는 아래의 3가지 차이점 중 1가지가 서로 다르다고 할 수 있다.

  • 범위 지정 함수의 호출 시에는 수신 객체가 매개 변수로 명시적으로 전달 되거나 수신 객체의 확장 함수로 암시적 수신 객체로 전달 된다.
  • 범위 지정 함수 의 수신 객체 지정 람다 에 전달되는 수신 객체가 명시적 매개 변수 로 전달 되거나 수신 객체의 확장 함수로 암시적 수신 객체로 코드 블록 내부로 전달 된다.
  • 범위 지정 함수의 결과로 수신 객체를 그대로 반환하거나 수신 객체 지정 람다 의 실행 결과를 반환한다.

다음 글에서는 위에서 설명한 5개 함수의 예시를 설명하는 글을 정리하겠습니다.


출처