범위지정 함수
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
을 사용하지 않는 동일한 코드는 아래와 같다.