코틀린 스터디 34

아이템2) 변수의 스코프를 최소화하라

이펙티브 코루틴을 요약한 내용입니다. 상태를 정의할 때는 변수와 프로퍼티의 스코프를 최소화하는 것이 좋음 프로퍼티보다는 지역 변수를 사용하는 것이 좋음 최대한 좁은 스코프를 갖게 변수를 사용 반복문 내부에서 사용하는 변수의 경우 반복문 내부에 작성하는 것이 좋음 변수 스코프를 제한하는 예제 // 나쁜 예 var user: User for (i in users.indices) { user = users[i] print("User at $i is $user") } // 조금 더 좋은 예 for (i in users.indices) { val user = users[i] print("User at $i is $user") } // 제일 좋은 예 for ((i, user) in users.withIndex())..

아이템1) 가변성을 제한하라

이펙티브 코루틴을 요약한 내용입니다. 코틀린은 모듈로 프로그램을 설계 클래스, 객체, 함수, 타입 별칭(type alias), 톱레벨(top-level) 프로퍼티 등 다양한 요소로 구성 됨 읽고 쓸수 있는 프로퍼티 var를 사용하거나, mutable 객체를 사용하면 상태를 가질 수 있다 var a = 10 var list: MutableList = mutableListOf() 계좌에 돈이 얼마나 있는지 나타내는 상태 예제 class BankAccount { var balance = 0.0 private set fun deposit(depositAmount: Double) { balance += depositAmount } @Throws(InsufficientFunds::class) fun withdraw..

플로우 생명 주기 함수

코틀린 코루틴을 요약한 내용입니다. 플로우는 요청이 한쪽 방향으로 흐르고 요청에 의해 생성된 값이 다른 방향으로 흐르는 파이프라 생각할 수 있음 플로우가 완료되거나 예외가 발생했을 때, 정보가 전달되어 중간 단계가 종료 모든 정보가 플로우로 전달되므로 값, 예외 및 다른 특정 이벤트를 감지할 수 있음 onEach onEach 람다식은 중단 함수 원소는 순서대로 처리 delay를 넣으면 각각의 값이 흐를 때마다 지연 suspend fun main() { flowOf(1, 2, 3, 4) .onEach { print(it) } .collect() } onStart 최종 연산이 호출될 때 플로우가 시작되는 경우에 호출 첫 번째 원소를 요청했을 때 호출 suspend fun main() { flowOf(1, 2..

코틀린 스터디 2024.02.02

플로우 만들기

코틀린 코루틴을 요약한 내용입니다. 원시값을 가지는 플로우 플로우를 만드는 가장 간단한 방법은 플로우가 어떤 값을 가져야하는지 정의하는 flowOf함수를 사용하는 것 suspend fun main() { flowOf(1, 2, 3, 4, 5).collect { print(it) } } 값이 없는 경우 emptyFlow() 함수 사용 suspend fun main() { emptyFlow().collect { print(it) } } 컨버터 asFlow 함수를 사용해서 iterable, Iterator, Sequence를 Flow로 바꿀 수 있음 suspend fun main() { listOf(1, 2, 3, 4, 5) .asFlow() .collect { print(it) } } 함수를 플로우로 바꾸기..

코틀린 스터디 2024.02.02

플로우의 실제 구현

코틀린 코루틴을 요약한 내용입니다. 플로우는 어떤 연산을 실행할지 정의 중단 가능한 람다식에 몇 가지 요소를 추가 Flow 이해하기 람다식은 한 번만 정의되고 여러 번 호출 할 수 있음 fun main() { val f: () => Unit => { print("A") print("B") print("C") } f() f() } 람다식은 순차적으로 호출되기 때문에, 이전 호출이 완료되기 전에 같은 람다식을 추가적으로 후출할 수는 없음 fun main() { val f: suspend () => Unit => { print("A") delay(1000) print("B") delay(1000) print("C") } f() f() } 람다식은 함수를 나타내는 파라미터를 가질 수 있음 람다식 f를 호출할 때..

코틀린 스터디 2024.02.02

플로우란 무엇인가?

코틀린 코루틴을 요약한 내용입니다. 플로우는 비동기적으로 계산해야 할 값의 스트림 플로우 인터페이스 자체는 떠다니는 원소들을 모으는 역활 플로우 끝에 도달할 때까지 각 값을 처리하는 것을 의미 플로우의 collect는 컬렉션의 forEach와 비슷 interface Flow { suspend fun collect(collector: FlowCollector) } 플로우의 유일한 멤버 함수는 collect 다른 함수들은 확장 함수로 정의 되어 있음 interface Iterable { operator fun iterator(): Iterator } interface Sequence { operator fun iterator(): Iterator } 플로우와 값들을 나타내는 다른 방법들의 비교 원소들이 채워..

코틀린 스터디 2024.01.04

핫 데이터 소스와 콜드 데이터 소스

코틀린 코루틴을 요약한 내용입니다. 채널은 값을 핫(hot) 스트림으로 가지지만, 콜드(cold) 스트림이 필요할 때가 있습니다. 우리가 사용하는 대부분의 데이터 소스는 두 가지 종류로 구분할 수 있음 컬렉션은 핫, Channel은 핫 Sequence와 자바의 Stream은 콜드, Flow와 RxJava 스트림은 콜드 핫 vs 콜드 핫 데이터 스트림의 빌더와 연산은 즉각 실행 콜드 데이터 스트림에서는 원소가 필요할 때 까지 실행되지 않음 fun main() { val l = builList { repeat(3) { add("User$id") println("L: Added User") } } val l2 = l.map { println("L: Processing") "Processed $it" } val..

코틀린 스터디 2024.01.04

셀렉트

코틀린 코루틴을 요약한 내용입니다. 코루틴은 가장 먼저 완료되는 코루틴의 결과를 기다리는 select 함수를 제공 💡 select 함수는 코틀린 코루틴이 정식으로 출시된 이후부터 사용이 가능했지만, 여전히 실험용 지연되는 값 선택하기 여러 개의 소스에 데이터를 요청한 뒤, 가장 빠른 응답만 얻는 경우 요청을 여러 개의 비동기 프로세스로 시작 select 함수를 표현식으로 사용하고 값을 기다린다 비동기 결과값 하나만 반환하는 예제 하나의 비동기 작업이 완료됨과 동시에 끝나게 되어 결과값 반환 suspend fun requestData1(): String { delay(100_000) return "Data1" } suspend fun requestData2(): String { delay(1000) ret..

코틀린 스터디 2024.01.04

채널

코틀린 코루틴을 요약한 내용입니다. 코루틴끼리의 통신을 위한 기본적인 방법으로 채널 API가 추가 채널은 송신자와 수신자의 수에 제한이 없으며, 채널을 통해 전송된 모든 값은 단 한번만 받을 수 있음 Channel은 두 개의 서로 다른 인터페이스를 구현한 하나의 인터페이스 SendChannel은 원소를 보내거나 채널을 닫는 용도 ReceiverChannel은 원소를 받을 때 사용 interface SendChannel { suspend fun send(element: E) fun close(): Boolean } interface ReceiverChannel { suspend fun receive(): E fun cancel(cause: CancellationException? = null) } inte..

코틀린 스터디 2023.12.04

코루틴 스코프 만들기

코틀린 코루틴을 요약한 내용입니다. CoroutineScope 팩토리 함수 CoroutineScope는 coroutineContext를 유일한 프로퍼티로 가지고 있는 인터페이스 interface CoroutineScope { val coroutineContext: CoroutineContext } CoroutineScope 인터페이스를 구현한 클래스를 만들고 내부에서 코루틴 빌더를 직접 호출 가능 잘 사용되지 않음 cancel, ensureActive 같은 다른 CoroutineScope의 메서드를 직접 호출하면 문제 발생 할 수 있음 class SomeClass: CoroutineScope { override val coroutineContext: CoroutineContext = Job() fun o..

코틀린 스터디 2023.11.24