부스트코스 서포터즈 3기

[부스트코스] 코틀린 제공 표준 라이브러리 함수1 (let(), apply(), also())

YERIEL 2021. 2. 8. 23:24

이 포스트는 부스트코스 서포터즈 3기 활동을 기반으로 정리된 글입니다.

코틀린 제공 표준 라이브러리 함수

  • 람다식을 사용하는 코틀린의 표준 라이브러리에서 let(), apply(), with(), also(), run() 등 여러 가지 표준 함수 제공
  • 코드를 축약시키거나 사용에 간편을 더함

 

let()

  • 함수를 호출하는 객체 T를 이어지는 block의 인자로 넘기고 block의 결과값 R을 반환
public inline fun <T, R> T.let(block: (T) -> R) : R {
    ...
    return block(this)
}
  • 매개변수 block은 T를 매개변수로 받아 R을 반환
  • let() 함수 역시 R을 반환
  • 본문의 this는 객체 T를 가리키는데 람다식 결과 부분을 그대로 반환한다는 뜻
  • 다른 메소드를 실행하거나 연산을 수행해야 하는 경우 사용

 

let 실습

checkScore 함수는 일반적인 null을 검사하는 함수이고, checkScoreLet 함수는 let을 사용해 null검사를 제거하는 함수이다.

checkScore 함수에서는 null이 아니면 score을 출력한다

checkScoreLet함수에서는 ?.을 통해 null인지 확인한다. null이면 score?.let 문장을 실행하지 않는다.

null일 경우를 처리하고 싶다면, score?.let { println("Score $it")} ?: println("NULL")

이런식으로 엘비스 연산자를 사용하면 된다.

it은 score 값을 복사하여 가지고 있다.

 

let 함수의 체이닝 (chaining)

  • 여러 메소드 혹은 함수를 연속적으로 호출하는 기법

 

let의 중첩 사용

let을 중첩 사용할 수 있다. 이 때는 it을 사용하지 않고 명시적 이름을 사용해야 한다.

반환 값은 바깥 쪽의 람다식에만 적용되기 때문에 Inner String은 반환되지 않는다.

 

also()

  • also()는 함수를 호출하는 객체 T를 이어지는 block에 전달하고 객체 T 자체를 반환
public inline fun <T, R> T.let(block: (T) -> R) : R = block(this)
public inline fun <T> T.also(block: (T) -> Unit) : T {block(this); return this}
  • also는 블록 안의 코드 수행 결과와 상관없이 T인 바로 객체 this를 반환

 

also() 실습

person이 it으로 복사되어 들어감. 그래서 skills를 사용할 수 있음.

let의 success는 마지막 문장을 반환하는 반면, also의 success는 마지막 문장을 반환하지 않고, person 본체를 반환한다.

 

apply()

  • apply()함수는 also()함수와 마찬가지로 호출하는 객체 T를 이어지는 block으로 전달하고 객체 자체인 this를 반환
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
public inline fun <T> T.also(block: (T) -> Unit): T {block(this); return this}
public inline fun <T> T.apply(block: T.() -> Unit): T {block(); return this}
  • T.()와 같은 표현에서 람다식이 확장 함수로서 처리
  • 디렉터리 생성 시 사용할 수 있음

 

apply() 실습

apply() 함수에서는 this를 생략할 수 있고, this 없이 객체의 멤버에 여러 번 접근이 가능하다.

 

cf) also는 it으로 받고 생략할 수 없는 반면, apply는 this로 받고 생략 가능하다.