Kotlin
-
kotlin enum 상태 관리 구현하기Kotlin/Kotlin 2024. 9. 27. 21:20
개요 소프트웨어를 개발하다 보면 내부적인 상태를 관리해야 합니다. 이때 상태는 5가지 이내로 간단하게 표현될 수도 있고 50가지 혹은 그 이상으로 표현될 수도 있습니다. 어떻게 하면 수많은 상태가 존재할 때 안정적으로 상태를 관리하고 가독성 및 유지보수성을 챙길 수 있을까요? 유한상태기계(Finite State Machine)상태에 대해 공부하다 보면 유한상태기계 (FSM)이라는 개념이 종종 보입니다. 유한상태기계란 결국 한정되어 있는 개수의 복잡한 상태를 설계하는 데 사용하는 수학적 기법입니다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 됩니다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 합니다. 결국 중요..
-
코루틴 Timeout이 제대로 동작하지 않은 이유Kotlin/코루틴 2024. 3. 25. 00:24
개요코루틴 timeout을 다루며 코루틴 Timeout이 제대로 동작하지 않은 이유에 대해 공유해보고자 합니다.부제: coroutine timeout dose not work 코루틴의 withTimeout 메서드public suspend fun withTimeout(timeMillis: Long, block: suspend CoroutineScope.() -> T): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } if (timeMillis setupTimeout(TimeoutCoroutine(timeMillis, uCont), block) }} withTimeout 메서드를 활용하면 ..
-
Kotlin takeIf와 takeUnless 함수Kotlin/Kotlin 2024. 3. 13. 00:01
개요 Kotlin에서 takeIf()와 takeUnless() 함수를 제공한다는 사실을 알게 되었고, 해당 함수들에 대해서 알아보고자 합니다. takeIf 함수 public inline fun T.takeIf(predicate: (T) -> Boolean): T? { contract { callsInPlace(predicate, InvocationKind.EXACTLY_ONCE) } return if (predicate(this)) this else null } takeIf 함수는 T (어떤 객체)의 확장함수입니다. predicate를 인자로 받아서 조건에 만족하는경우 자기 자신을 반환하거나 null을 반환합니다. takeUnless 함수 public inline fun T.takeUnless(predi..
-
Kotlin fold, reduce 메서드Kotlin/Kotlin 2024. 3. 10. 00:01
Reduce 메서드 public inline fun Iterable.reduce(operation: (acc: S, T) -> S): S { val iterator = this.iterator() if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.") var accumulator: S = iterator.next() while (iterator.hasNext()) { accumulator = operation(accumulator, iterator.next()) } return accumulator } reduce 메서드의 경우 Iterable의 확장함수입니다. 초기값은 컬렉션의 첫 ..
-
Kotlin associateBy, groupBy 함수Kotlin/Kotlin 2024. 3. 9. 00:01
개요 Kotlin의 Collection을 다루는 방법 중 associateBy 함수와 groupBy 함수에 대해서 알아보고자 합니다. associateBy와 groupBy 함수 둘의 공통점은 collection의 특정한 키로 map을 만들어냅니다. 키는 KeySelector 매개변수에 정의되고 valueSelector는 키의 값에 어떤 내용을 저장할지를 정의합니다. associateBy와 groupBy 함수의 차이점 associateBy 함수는 key가 동일할 때 마지막으로 등장한 값을 덮어씌워서 사용하며 groupBy는 key가 동일하더라도 list로 모든 값을 다룰 수 있습니다. associateBy 내부구현 //key값만 받음 public inline fun Iterable.associateBy(k..
-
kotlin interface default methodKotlin/Kotlin 2024. 3. 5. 00:01
개요Java8부터는 interface의 default method를 지원하지만 kotlin에서는 어떻게 활용해 볼 수 있을지에 대해 알아보고자 합니다. 문제 상황No property betweenOsVer found for type ${EntityName} JPA를 활용하기 위해서는 interface를 정의하지만 해당 interface 내부에 기본 구현을 적용하고 싶어 default method를 활용하였습니다. default method를 활용하면 spring-data-jpa가 메서드의 이름을 기반으로 쿼리를 만들어주지 않기 때문에 하지만 kotlin에서는 deafult method를 기본적으로 지원하지 않아 메서드 이름을 기반으로 쿼리를 만들어주려다가 약속된 네이밍이 아니기 때문에 위와 같은 에러메..
-
kotlin delegated propertiesKotlin/Kotlin 2024. 3. 1. 00:01
개요 class Example { var p: String by Delegate() } kotlin을 활용하다 보면 by 키워드등이 활용되는 예시를 만난 적들이 있으며 해당 문법을 잘 모르는 상황에서 당황스러운 경험들이 있습니다. kotlin delegated property에 대해 이해하기 위해 글을 작성해보가 합니다. Delegated Properties란? delegated는 "위임된" 이라는 뜻을 가집니다. 즉 프로퍼티의 속성을 미리 정의된 다른 속성에게 위임한다는 의미를 가집니다. Kotlin에서는 by 키워드를 활용하여 프로퍼티의 위임을 수행할 수 있습니다. Interface의 구현체를 다른 객체에게 위임할 수 있고, Property의 Accessor 구현을 다른 객체의 위임할 수도 있습니다...
-
Kotlin 제네릭에 대해 알아보기Kotlin/Kotlin 2024. 2. 29. 00:01
개요 Java의 제네릭, Kotlin의 제네릭 등에 대해 학습하였고 포스팅도 여러 차례 썼지만 아직도 제네릭에 대한 이해도가 부족하다고 느낍니다. 이번기회에 확실하게 제네릭의 타입 변환에 대해 이해해보고자 합니다. 제네릭 사용하는 이유 예를들어 String을 담고 싶은 Box, Int를 담고 싶은 Box 클래스를 만들기 위해서는 어떻게 해야 할까요? @Test fun `다양한 타입을 구현하기 위한 방법-v1`(){ IntBox(3) StringBox("Hello Generic") } data class IntBox( val value: Int, ) data class StringBox( val value: String, ) IntBox, StirngBox 클래스를 만들면 됩니다! 이제 이외의 여러 가지 ..