범위지정 함수


apply, with, let, also, run

위와 같은 함수들을 범위 지정 함수라고 한다.

위 함수들은 전달받는 인자작동 방식, 결과가 매우 비슷하기 때문에 많은 경우에 서로를 대체해서 사용이 가능하다.

범위 지정 함수들은 두 가지의 구성 요소를 갖는다.

  • 수신 객체
  • 수신 객체 지정 람다(lambda with receiver), 코드블럭(block)


위의 범위 지정 함수 with의 정의를 살펴보면 receiver수신 객체, block수신 객체 지정 람다에 해당한다.

아래의 예제 코드는 사용 예다.


5가지 범위 지정 함수의 정의


각 함수의 사용 규칙(공식 문서 권장)

apply

수신 객체 람다(block: T.() → Unit) 내부에서 수신 객체의 함수(T.someFunc())를 사용하지 않고 수신 객체 자신(T 타입의 인스턴스)를 다시 반환하려는 경우에 사용

수신 객체의 프로퍼티만을 사용하는 대표적인 경우가 객체의 초기화


also

수신 객체 람다(block: (T) → Unit)가 수신 객체(T)를 전혀 사용하지 않거나 수신 객체의 속성을 변경하지 않고 사용하는 경우에 사용

객체의 사이드 이펙트 확인, 수신 객체의 데이터 유효성 검사시에 유용


let

  • 지정된 값이 null이 아닌 경우에만 코드를 실행해야 하는 경우.
  • Nullable 객체를 다른 Nullable 객체로 변환하는 경우.
  • 단일 지역 변수의 범위를 제한하는 경우.


let을 사용하지 않는 동일한 코드는 아래와 같다.


with

Non-nullable(Null이 될 수 없는) 수신 객체이고, 결과가 필요하지 않은 경우에 사용


run

어떤 값을 계산할 필요가 있거나 지역 변수 여러개의 범위를 제한할 때 run을 사용한다.

매개 변수로 전달된 명시적 수신 객체암시적 수신 객체로 변환할 때도 사용할 수 있다.


run을 사용하지 않는 동일한 코드는 아래와 같다.