참고 : https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29

 

코틀린 의 apply, with, let, also, run 은 언제 사용하는가?

원문 : “Kotlin Scoping Functions apply vs. with, let, also, and run”

medium.com

 


위 다섯개의 함수는 아래의 경우에서 각기 다른 특징을 가진다.

 

1. 호출 형태 (리시버를 어떻게 전달하는지?)

 A. 확장함수 형태

 B. 일반함수 형태

2. 코드 블록 내에서 리시버 객체를 어떻게 호출하는지?

 A. 파라미터로 전달하였기 때문에 it 키워드로 접근

 B. 리시버 객체로 전달하였기에 this 키워드로 접근

3. 반환값이 무엇인지?

 A. 전달 받은 리시버 객체

 B. 코드 블록의 수행 결과

 

  let run (확장함수) also apply with
호출 형태 A A A A B
코드 블록 내에서 리시버 객체에 접근하는 방법 A B A B B
반환값 A A B B A
언제 사용하는지? 리시버 객체가 null이 아닌 경우에 코드를 실행해야 하는 경우

Nullable 객체를 다른 Nullable 객체로 변환하는 경우

단일 지역 변수의 범위를 제한하는 경우(한 번 쓰고 말 변수 선언해서 사용하는 경우 방지)
어떤 값을 계산하거나

여러 개의 지역 변수의 범위를 제한하고자 할 때 (한번 쓰고 말 변수 선언해서 사용하는 경우 방지)
리시버 객체의 속성을 변경하지 않고 함수를 실행하고

리시버 객체를 다시 반환하려고 할 때
리시버 객체의 함수를 사용하지 않고 속성을 초기화한 뒤

리시버 객체를 다시 반환하려고 할 때
리시버 객체가 null이 아닌 경우에만 사용

결과가 필요하지 않을 때
사용 예시 다른 함수를 실행하거나 연산을 수행하는 경우 위 링크 참고 객체의 사이드이펙트 확인 시
객체의 초기화
레이아웃 초기화
null이 아닌 객체의 프로퍼티를 읽어서 처리하는 경우

리시버 객체를 전달하는 방식이 두 가지가 있는데 

let, also와 같이 내부에서 it으로 접근하는 방식은 

리시버 객체를 복사하여 전달하고

run, apply, with는 객체 본인을 그대로 전달한다는 차이가 있다.

+ Recent posts