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

Refactoring to Expressive Kotlin

Refactoring to Expressive Kotlin

2024.06.29
kotlinConf'24

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 키워드를 사용하여 객체 접근 객체 자신