코틀린 표준 라이브러리 함수
강성우, 10 June 2020
코틀린의 표준화 된 함수들중 일부를 정리 하였다. 몰론 개발자에 따라서 이 함수를 꼭 사용할 필요는 없다고 생각 한다. 왜냐하면 코틀린에서는 다양한 확장함수 를 직접 만들 수 있고 개발중인 도메인, 피쳐 등에 따라 성격과 네이밍이 바뀔 수 있으므로 그때마다 확장함수를 만들어서 사용해도 무방하다고 생각 한다. (몰론 기술적인 측면에서 표준 라이브러리 함수들과 성능상의 차이 등이 없어야 할 것이다)
표준 라이브러리 자체는 여러 개발자가 한 프로젝트를 개발할 때 유용하다고 할 수 있겠다. 각 필요한 확장함수를 코드리뷰및 검토 후 추가하는 방법도 좋지만 더 많은 사람들에게 보여주는 경우(오픈소스 와 같은) 더 빠르게 이해할 것 이다. 몰론 이는 이 함수들을 알고 있다는 것을 전제로 한다.
apply, also, let, run, with
- apply, also : 객체(리시버)의 프로퍼티를 변경 하고 그 객체를 반환 할때.
- let, run : 객체(리시버) 자체 혹은 프로퍼티들을 이용해서 무엇인가를 하고 다른 객체를 반환 할 때.
- with : 결과 반환이 필요하지 않은 객체를 받아 무엇인가를 할 때.
// T is Receiver, block is lambda
inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
inline fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
inline fun <T, R> T.run(block: T.() -> R): R {
return block()
}
inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
하단 예제 코드를 참고 하도록 하자.
A.apply { this.b = "b" }.receiverACodes()...
// 리시버의 프로퍼티만 변경할 수 있음 (but, it's variables only) val product = Product().apply { this.name = "Park" this.price = 100 }
A.also { a -> a.b = "b" }.receiverACodes()...
val product2 = Product().also() { product -> product.name = "Lee" product.price = 125 }
A?.let { a -> "b"}.returningBCodes()...
val result = product2.let { product -> product.name } println(result)
A.run { this.b = "b" ; this.b }.returningBCodes()...
val newPrice = product2.run { this.price += 300 this.price } println(newPrice)
val result = with(a) { this.b = "b"; this.b }
val newPrice2 = with(product2) { this.price += 125 this.price } println(newPrice2)
synchronized
inline fun <R> synchronized(lock: Any, block: () -> R): R
lock
객체를 mutex(스레드 락을 잡기 위한 대상 객체), 뮤텍스를 얻었을 경우 동기화 블럭인 block
을 실행 하게 한다.