let, apply, run, with 함수
코틀린에서 제공하는 여러 함수 중 비슷하면서도 조금 다른.. 헷갈리는 함수 4가지에 대해 알아보자.
let
let()
은 함수를 호출하는 객체를 이어지는 블록의 인자로 넘기고, 블록의 결과값을 반환합니다.- 사용 예)
- 함수를 호출한 객체를 인자로 받으므로 이를 사용하여 다른 메소드를 실행하거나 연산을 수행해야 하는 경우 사용할 수 있습니다.
apply
apply()
는 함수를 호출하는 객체를 이어지는 블록의 리시버로 전달하고 객체 자체를 반환합니다.리시버? 바로 이어지는 블록 내에서 메소드 및 속성에 바로 접근할 수 있도록 할 객체를 의미합니다.
사용 예)
- 특정 객체를 생성하면서 함께 호출해야 하는 초기화 코드가 있는 경우 사용할 수 있습니다.
run
- 객체 없이
run()
함수를 사용하면 인자 없는 익명 함수처럼 사용할 수 있습니다. 이어지는 블럭 내에서 처리할 작업들을 넣어줄 수 있고, 일반 함수처럼 값을 반환하지 않거나(Unit) 특정 값을 반환할 수도 있습니다. - 객체에서
run()
함수를 호출할 경우, 호출하는 객체를 이어지는 블록의 리시버로 전달하고, 블록의 결과값을 반환합니다. run()
함수는with()
함수를 좀 더 편리하게 사용하기 위해let()
함수와with()
함수를 합쳐놓은 형태라고 생각하면 됩니다.- 또한, 안전한 호출(Safe calls)를 사용할 수 있어 특정 컴포넌트(?)가 null이 아닐 경우에만 블록 내 명령들을 실행하도록 할 수 있습니다.
- 사용 예)
- 객체에서 이 함수를 호출하는 경우 객체를 리시버로 전달받으므로, 특정 객체의 메소드나 필드를 연속적으로 호출하거나 값을 할당할 때 사용합니다.
apply()
와 유사하지만,apply()
는 새로운 객체를 생성함과 동시에 연속된 작업이 필요할 때 사용하고run()
은 이미 생성된 객체에 연속된 작업이 필요할 때 사용한다는 차이가 있습니다.
with
with()
함수는 인자로 받는 객체를 이어지는 블록의 리시버로 전달하며, 블록의 결과를 반환합니다.with()
함수는 사실상run()
함수와 기능이 거의 동일하며 리시버로 전달할 객체가 어디에 위치하는지만 다릅니다.run()
이 안전한 호출(Safe calls)를 지원하는데 반해with()
함수는 이를 자체적으로 지원하지 않습니다.