본문 바로가기
카테고리 없음

코틀린 표준 scope 함수 ( let, apply, with, also, run )

by 찐세 2021. 9. 6.

 

예제 1 - 변수 할당 줄이기

이랬던 코드가
이렇게! 

let을 사용해서 불필요한 변수 할당을 줄여 메모리를 절약할 수 있다.

 

 

예제 2 - nullable 한 객체에서 let 사용하기

이랬던 코드를!
if 문 없이 표현할 수 있고,
이랬던 조건문을!
간단하게 표현할 수 있다.

이렇게 let 과 세이프 콜, 앨비스 연산자를 활용하면 더 if 문 만큼 직관적이고, 간결한 코드를 작성할 수 있다.

무엇보다 자바보다 훨~~씬 멋있고 코틀린스러워서 좋다 ㅎㅎ😎

 

 

 

 

also는 this(T)를 리턴한다는 점이 포인트이다.

 

예제 1

같은 내용의 코드를 한 줄로 표현할 수 있다.

let 과 also를 사용하여 코드를 한 줄로 표현할 수 있다. 표준함수에 익숙해지면 이 표현도 상당히 직관적일 것 같다.

 

 

 

 

apply 메서드는 also 메서드와 매우 유사하지만 차이점이 존재한다.

T.( ) 같은 표현에서도 알 수 있듯이 메서드의 매개변수로 주어지는 람다식이 T확장함수로 처리가 된다는 점이다.

T의 확장함수로 처리되기 때문에, T 의 필드를 this로 참조할 수 있다. ( 클로저를 사용하는 방식과 같다.)

확장함수에서 내부 필드를 참조할 때 this가 없어도 되기 때문에, 간단하게 내부 필드에 접근할 수 있다.

예제를 통해서 also 와 차이점을 보고, 어떤 상황에서 also 보다 apply가 편할지 알아보자.

 

예제 1 - 레이아웃 초기화에 활용해보기

이렇게 객체의 내부 필드를 초기화하는 코드를?!
짜잔~ 훨씬 간결하고 보기 좋은 코드가 되었다.

apply 는 람다식이 확장 함수라는 것이 특징이기 때문에, 내부 필드를 수정하거나 접근하는 경우에 활용하면 간결한 코드 작성이 가능할 것으로 보인다.

 

 

 

 

 

run 메서드는 두가지의 형태가 있다. 

 

예제 1 - 객체에서 호출하지 않는 형태

흐음.. 

예제 2 - 객체에서 호출하는 형태

으흠~!!

apply 와는 다르게 해당 객체 T를 리턴하는 것이 아니라, 람다식의 리턴 값을 그대로 리턴하게 된다.

 

 

 

 

 

with 는 run과 기능이 거의 똑같다. 차이점은 리시버에 해당하는 객체를 메서드의 매개변수로 넣어준다는 것이다. 무슨 차이 때문에 run 이랑 이것을 구분해 놓은 것일까..?

 with 메서드는 세이프콜을 사용할 수 없기 때문에 (당연히), 널 검사를 하기 위해서는 let 과 함께 활용 할 수 있다. 

 

예제 1

하지만 사실 이 코드는..
run을 사용하면 더 간단하긴 하다..^^

 

 

 

 

 

takeIf 는 매개변수인 람다식의 결과가 true 이면 값 T를 리턴하고, 아니면 null 을 리턴한다.

takeUnless 는 반대로 매개변수의 람다식의 결과가 false이면 값 T를 리턴하고 아니면 null을 리턴한다.

 

예제 

 

 

 

 

 

이렇게 코틀린의 다양한 표준함수를 사용하면 기존의 코드를 더 직관적이고 간결하게 작성하는 데 많은 도움이 된다.

나도 이제 표준함수를 적극 활용하여 이에 익숙해지는 시간을 가질 예정이다. 불필요한(?) 코드를 많이 줄일 수 있을 것 같다.