scope functions 정리
https://kotlinlang.org/docs/reference/scope-functions.html
코틀린이 지원하는 scope functions 들에 대해 위의 링크를 참고하여 정리하는 글입니다.
scope functions 에는 apply, also, with, let, run, takeIf, takeUnless 들이 있고
각자 사용하는 방법은 거의 동일하지만 반환 값과 프로퍼티를 받는 방법에서 차이가 있습니다.
다음의 모든 설명은 위의 Person 클래스와 함께 합니다.
1. apply
apply는 호출한 대상을 this로 넘겨주고
코드 블록이 전부 실행된 후 자기 자신 this를 다시 반환합니다.
this를 넘겨주기 때문에 생략하여 사용 가능합니다.
apply는 객체 생성 시의 초기화 과정에서 사용하여 무분별한 생성자 생성이나 객체 초기화 코드로 인해 코드량이 길어지는 것을 막을 수 있습니다.
apply를 활용하면 Builder 패턴 구현도 간단하게 처리할 수 있습니다.
2. also
also는 호출한 대상을 it으로 넘겨주고
apply처럼 실행된 후 자기 자신을 다시 반환합니다.
manyPerson.removeAt(0)의 반환 값인 Person 객체에 also 함수를 실행하였습니다.
also의 입력으로 Person 객체가 들어오고 이름을 출력 후 다시 반환해줍니다.
also는 객체의 수정보다는 사용하여 수정 전후의 로그, 유효성 검사 등을 하거나
위와 같이 두 객체의 Swap 등에서 사용할 수 있습니다.
추가적으로 it을 입력으로 받는 also와 뒤에 나올 let, takeIf, takeUnless의 경우 다음과 같이
it 이 아닌 이름으로 자유롭게 선언하여 사용할 수 있습니다.
3. with
with는 다른 scope functions과 다르게 확장 함수가 아니기 때문에 위와 같이 사용하여야 합니다.
입력을 this로 넘겨주고 반환은 코드 블록의 마지막 결괏값을 반환합니다.
with는 반환 값이 없이 객체를 사용하는 경우나 사용할 객체나 프로퍼티의 설명을 위한 헬퍼로서 사용할 수 있습니다.
4. let
let 은 호출한 대상을 it으로 넘겨주고
코드 블록의 마지막 결괏값을 반환합니다.
let 은 주로 어떤 호출 체인의 결과를 사용할 때 사용하거나 특정 객체의 범위를 제한하고 싶을 때 사용합니다.
다른 사용법으론 위와 같이 Null 객체에 대한 Null-Safe 하게 작업을 하고 싶을 때?. 연산자와 함께 많이 사용하지만 with를 제외한 다른 scope functions 도?. 사용을 통해 Null-Safe 하게 동작 가능하기 때문에
상황에 맞게 사용하면 됩니다.
5. run
run은 다른 scope functions 과는 다르게 this를 통해서 호출이 가능합니다.
위의 예제에선 this 인 MainActivity를 인자로 받았고 마지막 코드 블록의 결과를 반환합니다.
run 은 주로 객체 초기화와 계산 ( 함수 실행 )에 많은 지역변수가 필요한 경우에 범위를 제한하고 가독성을 높이기 위해서 사용합니다.
6. takeIf, takeUnless
takeIf, takeUnless는 다른 scope functions와 다르게 실행을 위한 게 아닌 if 문을 대체자로서 존재합니다.
takeIf는 if ( statement )를 takeUnless는 if (! statement )와 동일하게 동작하며 조건에 만족하면 해당 객체를 넘기고 만족하지 않으면 Null을 넘깁니다.
Null 이 넘어올 가능성이 있기 때문에 항상?. 와 함께 사용해야 하고, 다른 scope functions과 연결하면 if 문을 대체할 수 있습니다.