이 포스트는 부스트코스 서포터즈 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() 실습
'부스트코스 서포터즈 3기' 카테고리의 다른 글
[부스트코스] 자주 사용되는 기타 표준 함수 (람다식 검사, 시간 측정, 난수 생성) (0) | 2021.02.09 |
---|---|
[부스트코스] 코틀린 제공 표준 라이브러리 함수1 (let(), apply(), also()) (0) | 2021.02.08 |
[부스트코스] 클로저 (0) | 2021.02.08 |
[부스트코스] 흐름의 중단과 반환, 예외 처리 (0) | 2021.01.28 |
[부스트코스] 조건문과 반복문 (0) | 2021.01.27 |