목록분류 전체보기 (392)
Hanbit the Developer
💡 컴퓨터가 인식할 수 있는 코드는 바보라도 작성할 수 있지만, 인간이 이해할 수 있는 코드는 실력 있는 프로그래머만 작성할 수 있다. - Martin Flowler, 아이템 11: 가독성을 목표로 설계하라 인식 부하 감소 일반적으로 자주 사용하는 패턴을 활용할 것 극단적이게 되지 않기 경험이 많은 코틀린 개발자만 쉽게 이해할 수 있는 코드가 있으면, 제너럴하게는 이해하기 어려운 코드가 된다. 그럼에도 불구하고 이러한 ‘비용’을 지불할 만한 이유가 있다면 트레이드 오프를 진행하는 옵션을 고려할 수 있다. 컨벤션 아이템 12: 연산자 오버로드를 할 때는 의미에 맞게 사용하라 factorial() 함수를 쉽게 표현하기 위해 operator fun Int.not() = factorial()을 작성하여 사용하면..
아이템 1: 가변성을 제한하라 프로퍼티에 가변성이 있을 경우 일관성 문제, 복잡성 증가 문제, 그리고 멀티 쓰레드 문제 등 단점이 많기 때문에 제한해야 한다. *가변성을 완전히 제거하고자 하는 시도: 함수형 언어 *val은 getter만 제공하므로, val 프로퍼티를 var로 오버라이드 할 수 있다. val MutableList vs var List - 변이 지점을 어디에 두어야 하는가? 변경가능한 컬렉션을 관찰가능하게 하려면, 읽기 전용 컬렉션에 세터를 다는 것이 쉽다. 게다가 access modifier를 private로 달 수도 있으며 동기화를 구현하기 좋다. var list: List = listOf() private set(value) { // ... } 변경이 필요한 객체를 만들 때, data..
Kotlin Documentation 시리즈에 대해 Category: Official libraries 문서 링크: https://kotlinlang.org/docs/serialization.html 직렬화는 데이터를 네트워크로 보내거나 데이터베이스에 저장할 수 있는 형태로 변환하는 것이고, 역직렬화는 그러한 데이터를 런타임 오브젝트로 변환하는 것이다. Libraries kotlinx.serialization은 JVM, JavaScript, Native 플랫폼과 JSON, CBOR, protocol buffers 등의 다양한 직렬 포멧을 지원하는 라이브러리를 제공한다. Example: JSON serialization @Serializable 주석으로 클래스를 serializable하게 한다. @Seri..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/shared-mutable-state-and-concurrency.html 멀티 쓰레드 병렬 처리 문제는, 주로 shared mutable state 동기화에서 발생한다. 해결 방안은 멀티쓰레드에서의 그것과 유사하다. The problem suspend fun massiveRun(action: suspend () -> Unit) { val n = 100 // number of coroutines to launch val k = 1000 // times an action is repeated by each corouti..
Kotlin Documentation 시리즈에 대해Category: Official libraries - Coroutines문서 링크: https://kotlinlang.org/docs/exception-handling.htmlException propagation코루틴 빌더는 두 유형으로 나뉜다: 예외를 자동으로 전파하는 방식(launch, actor), 예외를 유저에게 노출(async, produce)하는 방식.(https://chat.openai.com/share/295078a5-2ad9-428d-a3ff-44ac4deafe02) 코루틴 빌더가 루트 코루틴을 생성하는 데 쓰였다면, 전자에 해당하는 빌더는 예외를 uncaught exception으로 취급한다.@OptIn(DelicateCoroutin..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/channels.html Channel basics BlockingQueue(”쓰레드 세이프하게 원자를 추가 및 삭제하는 자료구조로, 큐가 꽉 차있거나 비었을 때 쓰레드를 block할 수 있다.” - ChatGPT)와 개념적으로 유사하다. 차이점은 suspending send 함수, suspending receive 함수를 가졌다는 점이다. val channel = Channel() launch { // this might be heavy CPU-consuming computation or async logic, we..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/flow.html Representing multiple values Sequences *remind: lazily하게 작동하는 방식의 컬렉션 → 각 작업이 짧지 않은 시간이 소요될 경우 사용 fun simple(): Sequence = sequence { // sequence builder for (i in 1..3) { Thread.sleep(100) // pretend we are computing it yield(i) // yield next value } } fun main() { simple().forEac..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html 코루틴은 언제나 여러 코루틴 컨택스트로 표현된 컨텍스트에서 실행되며, 코루틴 컨택스트는 Dispatcher, Job, CoroutineExceptionHandler, CoroutineName 등 여러 요소의 집합이다. Dispatchers and threads CoroutineDispatcher는 어떤 쓰레드가 실행되는 데 사용되는지를 결정한다. 코루틴 디스패처는 코루틴 실행을 특정 쓰레드로 제한하거나, 쓰레드 풀 내에서 디스패치를 하거나, 제한 없..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/composing-suspending-functions.html Sequential by default fun main() = runBlocking { val time = measureTimeMillis { val one = doSomethingUsefulOne() val two = doSomethingUsefulTwo() println("The answer is ${one + two}") } println("Completed in $time ms") } suspend fun doSomethingUsefulOne():..
Kotlin Documentation 시리즈에 대해 Category: Official libraries - Coroutines 문서 링크: https://kotlinlang.org/docs/cancellation-and-timeouts.html val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // delay a bit println("main: I'm tired of waiting!") job.cancel() // cancels the job job.join() // waits for job's completion println("main: Now I can quit...