Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Refactoring to Expressive Kotlin

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Refactoring to Expressive Kotlin

2024.06.29
kotlinConf'24

Avatar for DavidKwon7

DavidKwon7

June 28, 2024
Tweet

More Decks by DavidKwon7

Other Decks in Technology

Transcript

  1. Naming - 서술적인 이름 짓기 - 명확성 - 기존에 약속된

    naming 스타일에 맞추기 - 변수는 특정적인 단어, 함수는 동사 선호
  2. this this 가 쓰이는 상황 this 의미 class 내부 class

    현재 객체를 참조 확장 함수 내부 . 왼쪽에 전달 된 리시버 파라미터 참조
  3. Kotlin - generics - Generics는 코드의 재사용성과 유연성을 높이기 위해

    사용 - Generics를 사용함으로써 , 다양한 타입의 객체를 다룰 수 있는 코드를 작성할 수 있다. 이를 통해 타입 안정성을 유지하면서도 일반화된 코드를 작성할 수 있다.
  4. Kotlin - generics 예제2 - Channel private val _viewEvent =

    Channel<Event<Any>>() val viewEvent: ReceiveChannel<Event<Any>> = _viewEvent fun viewEvent(content: Any) { viewModelScope.launch(BaseCoroutine. default) { _viewEvent.send(Event(content)) } }
  5. Kotlin - generics 예제2 - Channel private val _viewEvent =

    Channel<Event<Any>>() val viewEvent: ReceiveChannel<Event<Any>> = _viewEvent fun viewEvent(content: Any) { viewModelScope.launch(BaseCoroutine. default) { _viewEvent.send(Event(content)) } }
  6. Kotlin - generics - 무공변성 : 기본 Generic. - out

    (공변성) : 제네릭 타입 매개변수가 반환 타입으로 사용될 때 지정하며, 하위 타입으로 변환될 수 있습니다. - in(반공변성) : 제네릭 타입 매개변수가 매개변수로 사용될 때 지정하며, 상위 타입으로 변환될 수 있습니다.
  7. Kotlin - generics out (공변성) - 타입 매개변수가 생산(produce) :

    반환타입으로 사용 - 하위 타입 : 타입 매개변수는 하위 타입으로 취급 가능
  8. Kotlin - generics in (반공변성) - 타입 매개변수가 소비(consume) :

    매개변수로 사용될 때 - 상위 타입 : 타입 매개변수는 상위 타입으로 취급 가능
  9. Scope function 객체의 범위(scope)에서 코드를 실행하거나 객체를 조작할 수 있는

    편리한 방법을 제공합니다 . 주로 코드의 가독성을 높이고, 객체 지향적인 설계를 간결하게 할 수 있는 장점이 있습니다.
  10. apply private fun hikerDataSource(): HikariDataSource { val dataSource = HikariDataSource()

    dataSource.jdcUrl = jdcUrl.toString() dataSource.username = username dataSource.password = password dataSource.validate() return dataSource }
  11. apply private fun hikerDataSource(): HikariDataSource { val dataSource = HikariDataSource().apply

    { dcUrl = jdcUrl.toString() username = username password = password } dataSource.validate() return dataSource }
  12. apply inline fun <T> T.apply(block: T.() -> Unit): T -

    객체를 초기화하거나 설정할 때 유용 - 객체를 인자로 받고, 객체 자신을 반환
  13. with inline fun <T, R> with (receiver: T, block: T.()

    -> R) : R { return receiver.block() } - 객체 값 접근 및 수정하는 경우 - 객체를 인자로 받고, 블록 내에서 객체 멤버에 직접 접근 가능 - this 를 사용하지 않아도 접근 가능
  14. run inline fun <T, R> T.run(block: T.() -> R): R

    { return block() } - 지역 변수의 범위 제한 (isolate a block of code) - 객체의 함수를 호출하거나 객체 초기화 시 사용 - 블록 내에서 this 키워드를 사용하여 객체에 접근 가능 - 블록의 마지막 표현식 반환
  15. also public inline fun <T>.also( block: (T) -> Unit ):

    T - 객체를 사용하고 반환하지 않아도 되는 경우, 부가적인 작업을 수행할 때 유용. - 객체를 인자로 받고, 블록 내에서 객체를 수정 - it 을 사용하여 객체에 접근 - 객체 자신을 반환, 최종 결과에 영향을 끼치지 않음.
  16. let public inline fun <T, R> T.let(block: (T) -> R):

    R - nullable 처리 - 객체를 사용하고 그 결과를 반환해야 하는 경우 - 블록 내에서 it 키워드를 사용하여 객체에 접근 가능
  17. Scope function Scope function 특징 반환값 let it 을 사용해서

    객체 접근 블록의 결과 run this 을 사용해서 객체 접근 블록의 결과 with -객체를 인자로 받음 -this 없이 객체의 멤버에 직접 접근 가능 블록의 결과 apply this 없이 객체의 멤버에 직접 접근 가능 객체 자신 also it 키워드를 사용하여 객체 접근 객체 자신