일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 정보처리기사
- php
- node
- 스터디
- 변수
- 플러터
- Flutter
- 스나이퍼팩토리
- kotlininaction
- 코틀린
- php개발
- php변수
- 이클립스
- 서버
- 설치
- jquery
- 조건문
- Coroutine
- SwiftUI
- java
- Eclipse
- ios
- script
- Kotlin
- kotlin2.0
- Flow
- express
- node.js
- 그림으로 배우는 서버구조
- android
- Today
- Total
목록Kotlin (57)
mygomii

catch { } 연산자플로우 수집 중 발생한 예외를 잡는 연산자emit 이후부터 수집 단계까지의 예외를 잡을 수 있음collect 이후에는 못 잡음 → 이때는 try/catch로 감싸야함flow { emit(1) throw RuntimeException("예외 발생")}.catch { e -> emit(-1) // 예외 발생 시 기본값 emit}onCompletion { } 연산자정상 종료든 예외든 무조건 호출됨종료 원인을 cause 인자로 전달받음자원 정리, 로깅 등에 활용flow .onCompletion { cause -> println("끝남, 원인: $cause") }try/catch vs catchtry/catch는 collect 호출부 바깥에서 예외 잡을 때 사용catc..

CoroutineExceptionHandler는 코루틴에서 발생한 처리되지 않은 예외를 잡는 전역 핸들러특히 launch에서 발생한 예외는 try/catch로 처리하지 않으면 상위로 전파되고, 이때 이 핸들러가 개입함.UI 앱, 서버 애플리케이션에서 안정성을 높이기 위한 안전망 역할을 함.val handler = CoroutineExceptionHandler { _, exception -> println("❗ 전역 예외 처리됨: ${exception.message}")}val scope = CoroutineScope(Dispatchers.Default + handler)scope.launch { throw RuntimeException("예외 발생!")}특징설명적용 대상launch 기반 코루틴..

18.2.1 자식이 실패하며 모든 자식을 취소하는 코루틴하나의 자식 코루틴이 예외로 실패하면, 같은 스코프에 있는 다른 모든 자식 코루틴도 자동으로 취소됨이는 코틀린 코루틴의 구조화된 동시성(Structured Concurrency)의 핵심 동작 방식임실전에서는?이 방식은 오류가 전체 작업 흐름에 영향을 줘야 할 때 매우 유용(예: 모든 하위 작업이 성공해야만 하는 트랜잭션성 처리)만약 자식 간 영향을 분리하고 싶다면→ supervisorScope 또는 SupervisorJob을 사용해야 함SupervisorJob은 한 자식 코루틴의 실패가 다른 자식 코루틴에 영향을 주지 않도록 하는 Job기본 Job과 달리, 자식 중 하나가 실패하더라도 나머지 자식은 계속 실행됨구분일반 JobSupervisorJob자..

코루틴 안에서 예외가 발생하면 기본적으로 코루틴은 취소되고, 예외는 상위로 전파됨try/catch 구문을 사용하면 코루틴 내부에서 발생한 예외를 지역적으로 처리 가능함하지만 launch와 async의 예외 처리 방식은 다르다는 점을 이해해야 함빌더예외 처리 방식launch예외가 발생하면 즉시 전파됨 (try/catch로 잡아야 함)async예외가 await()를 호출할 때까지 연기됨 (이때 try/catch 필요)val job = scope.launch { try { throw RuntimeException("예외 발생") } catch (e: Exception) { println("launch 블록에서 예외 처리됨: ${e.message}") }}val defe..

중간 연산자는 주어진 플로우를 다른 플로우로 변환하지만 실제로 코드를 실행하지 않음실행은 최종 연산자가 담당최종 연산자는 단일 값이나 값의 컬렉션을 계산하거나, 플로우의 실행을 촉발시켜 지정된 연산과 부수 효과를 수행함가장 일반적인 최종 연산자는 collectcollect 는 플로우의 각 원소에 대해 실행할 람다를 지정할 수 있는 유용한 지름길을 제공이제는 중간 연산자를 배웠기 때문에 이 지름길 코드가 onEach 를 호출한 다음에 파라미터 없는 collect 를 호출하는 코드와 같다는 사실을 짐작할 수 있음fun main() = runBlocking { getTemperatures() .onEach { log(it) } .collect() }최종 연산자는 업스트림 플로우의 실행을 담..

코틀린 코루틴 라이브러리는 플로우를 조작할 수 있는 다양한 연산자를 제공함하지만 이런 연산자들이 내부적으로 어떻게 동작하며, 어떻게 우리가 직접 커스텀 중간 연산자를 만들수 있을까?코틀린 코루틴의 Flow는 map, filter, debounce 등 다양한 중간 연산자를 제공함이 연산자들은 내부적으로 flow 빌더와 emit를 활용해 동작함사용자가 직접 자신만의 중간 연산자를 만들 수 있음Flow를 확장 함수 형태로 만들고, 내부에서는 새로운 flow {}를 반환하며 collect로 upstream 값을 수집해서 가공하고 emit 함fun Flow.filterEven(): Flow = flow { collect { value -> if (value % 2 == 0) emit(value)..

중간 연산자는 플로우에 적용돼 새로운 플로우를 반환함플로우를 업스트림과 다운스트림 플로우로 구분해 설명할 수 있음연산자가 적용되는 플로우를 업스트림 플로우라고 함중간 연산자가 반환하는 플로우를 다운스트림 플로우라고 함다운스트임 플로우는 또 다른 연산자의 업스트림 플로우로 적용할 수 있음시퀀스와 마찬가지로 중간 연산자가 호출되더라도 플로우 코드가 실제로 실행되지 않음반환돈 플로우는 콜드상태시퀀스에서 사용할 수 있는 인기 있는 map, filter , onEach 등의 함수는 플로에서도 제공함이들의 행동방식도 예상하는 방식과 같음. 다만, 시퀀스나 컬렉션의 원소가 아니라 플로우의 원소에 대해 작용한다는 점만 다를 뿐17.2.1 업스트림 원소별로 임의의 값을 배출: transform 함수이미 알고 있을 map..

플로우가 코틀린의 동시성 매커니즘을 활용해 시간에 따라 나타나는 여러 연속적인 값을 처리할 수 있는 고수준의 추상화라는 점을 알게됨컬렉션을 조작하기 위해 사용할 수 있는 다양한 연산자가 있다는 사실을 살펴봄폴로우를 변활 때도 비슷한 연산자를 쓸 수 있음시퀀스와 마찬가지로 플로우도 중간 연산자와 최종 연산자를 구분함중간 연산자는 코드를 실행하지 않고 변경된 플로우를 반환하며, 최종 연산자는 컬렉션, 개별 원소, 계산된 값을 반환하거나 아무 값도 반환하지 않으면서 플로우를 수집하고 실제 코드를 실행함