Slide 1

Slide 1 text

Refactoring to Expressive Kotlin KotlinConf’24 권혁준

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

`hikariDataSource` function name refactoring → createHikariDataSource → convertToHikariDataSource → toHikariDataSource → hikariDataSourceFrom → hikariDataSourceFor

Slide 9

Slide 9 text

Naming - Naming Refactoring은 왜 필요할까?

Slide 10

Slide 10 text

Naming

Slide 11

Slide 11 text

Naming

Slide 12

Slide 12 text

Naming - 올바른 Naming 규칙은?

Slide 13

Slide 13 text

Naming - 서술적인 이름 짓기 - 명확성 - 기존에 약속된 naming 스타일에 맞추기 - 변수는 특정적인 단어, 함수는 동사 선호

Slide 14

Slide 14 text

this this 가 쓰이는 상황 this 의미 class 내부 class 현재 객체를 참조 확장 함수 내부 . 왼쪽에 전달 된 리시버 파라미터 참조

Slide 15

Slide 15 text

this

Slide 16

Slide 16 text

this

Slide 17

Slide 17 text

this

Slide 18

Slide 18 text

Kotlin - generics - Generics는 코드의 재사용성과 유연성을 높이기 위해 사용 - Generics를 사용함으로써 , 다양한 타입의 객체를 다룰 수 있는 코드를 작성할 수 있다. 이를 통해 타입 안정성을 유지하면서도 일반화된 코드를 작성할 수 있다.

Slide 19

Slide 19 text

Kotlin - generics 예제1 - Combine

Slide 20

Slide 20 text

Kotlin - generics 예제1 - Combine

Slide 21

Slide 21 text

Kotlin - generics 예제1 - Combine

Slide 22

Slide 22 text

Kotlin - generics 예제1 - Combine

Slide 23

Slide 23 text

Kotlin - generics 예제2 - Channel

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Kotlin - generics

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Kotlin - generics out (공변성) - 타입 매개변수가 생산(produce) : 반환타입으로 사용 - 하위 타입 : 타입 매개변수는 하위 타입으로 취급 가능

Slide 29

Slide 29 text

Kotlin - generics out 데이터 생산(read) / 하위 타입

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Kotlin - generic function in 데이터 소비 / 상위 타입

Slide 32

Slide 32 text

Kotlin - generics where

Slide 33

Slide 33 text

Kotlin - generics where

Slide 34

Slide 34 text

Kotlin - generics where

Slide 35

Slide 35 text

inline function

Slide 36

Slide 36 text

inline function

Slide 37

Slide 37 text

inline function lambda function은 생성되는 시점에 무명 class 객체가 생성. inline을 붙여주면, 방지 가능

Slide 38

Slide 38 text

noinline function

Slide 39

Slide 39 text

Scope function 객체의 범위(scope)에서 코드를 실행하거나 객체를 조작할 수 있는 편리한 방법을 제공합니다 . 주로 코드의 가독성을 높이고, 객체 지향적인 설계를 간결하게 할 수 있는 장점이 있습니다.

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

with

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

run 사용 예시

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

also 사용 예시

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

let 사용 예시

Slide 50

Slide 50 text

let public inline fun T.let(block: (T) -> R): R - nullable 처리 - 객체를 사용하고 그 결과를 반환해야 하는 경우 - 블록 내에서 it 키워드를 사용하여 객체에 접근 가능

Slide 51

Slide 51 text

let 사용 예시

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

함수 참조

Slide 54

Slide 54 text

함수 참조

Slide 55

Slide 55 text

함수 참조

Slide 56

Slide 56 text

감사합니다

Slide 57

Slide 57 text

Share your feedback to help us better understand your KotlinConf’24 Global experience! Subtitle Text