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

run()

  • run() 함수는 인자가 없는 익명 함수처럼 동작하는 형태와 객체에서 호출하는 형태 두 가지로 사용
public inline fun <R> run(block: () -> R): R = return block()
public inline fun <T, R> T.run(block: T.() -> R): R = return block()

 

run() 실습

apply와 run을 비교해보면, apply는 "success"가 사용되지 않지만, run은 apply처럼 this로 여러 변수에 접근 가능하면서도 "success"를 반환하기까지 한다.

run은 apply의 장점을 가져와서 this를 생략 가능하기도 하다.

 

with()

  • 인자로 받는 객체를 이어지는 block의 receiver로 전달하며 결과값을 반환
  • run()함수와 기능이 거의 동일한데, run의 경우 receiver가 없지만 with()에서는 receiver로 전달할 객체를 처리
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
  • with는 세이프 콜(?.)을 지원하지 않기 때문에 다음과 같이 let과 함께 사용, let으로 null일 경우 처리
supportActionBar?.let {
    with(it) {
        setDisplayHomeAsUpEnabled(true)
        setHomeAsUpIndicator(R.drawable.ic_clear_white)
    }
}
  • let과 with을 합치면 run으로 표현할 수 있음 => null을 처리할 때에는 run()이 더 적합함

 

with() 실습

 

use()

  • use()를 사용하면 객체를 사용한 후 close()등을 자동적으로 호출해 닫아줌
public inline fun <T: Closeable?, T> T.use(block: (T) -> R): R
public inline fun <T: AutoCloseable?, R> T.use(block: (T) -> R) : R
  • T의 제한된 자료형을 보면 Closeable?로 block은 닫힐 수 있는 개체를 지정해야 함
  • Java 7 이후는 AutoCloseable?로 사용됨
  • 파일 다룰 때 유리
public fun readFirstLine(): String {
    BufferedReader (FileReader("test.file")).use { return it.readLine() }
}

use의 구현부에는 Java처럼 try-catch-finally가 들어있다.

finally 부분에는 when이 사용되어 있다.

 

use() 실습

 

 

+ Recent posts