전체 글 136

Coroutine Dispatcher 와 스레드풀

Dispatchers.MainDispatchers.IODispatchers.Default Q1. 세 가지 Dispatcher 차이를 설명하고 각각 어떤 작업에 사용해야 하는지 말씀해주세요. 추가로 아래 코드에서 어떤 Dispatcher를 사용하는 것도 적절한지 생각해보세요. // 상황 A: 서버에서 사용자 한도 조회suspend fun fetchUserLimit() { api.getUserLimit()}// 상황 B: 10만 건의 거래 데이터 계산fun calculateTransactions() { // 복잡한 CPU 연산}// 상황 C: 조회한 한도를 화면에 표시fun updateLimitUI() { // UI 상태 변경}1. Disathcers.MainAndroid 메인 스레드에서 코..

개발 2026.10.23

process vs thread vs coroutine

1. Process * 실행 중인 프로그램의 인스턴스 - 독립적인 가상 주소 공간과 시스템 자원을 가짐 2. Thread* 프로세스 내부의 실행 단위. 같은 프로세스의 스레드끼리는 힙 메모리 등을 공유하지만, 각자의 실행 스택을 가짐 3. Coroutine중단과 재개가 가능한 경량 작업 단위. 스레드를 효율적으로 공유하며 비동기 작업을 처리 프로세스는 스레드들이 모여서 만들어지는 개념이라기보다 자원과 주소 공간을 관리하는 실행 환경 (그 안에서 하나 이상의 스레드가 실행됨) Q1. 프로세스와 스레드의 가장 큰 차이점 프로세스는 실행 중인 프로그램의 인스턴스로 독립적인 가상 주소 공간과 시스템 자원을 가짐스레드는 프로세스 내부에서 실행되는 단위.같은 프로세스의 스레드들은 healp 메모리와 자원을 공유..

개발 2026.10.20

Flow

cold/hot, stateflow, sharedflow, statein.sharedin, repeatOnLifecycle / collectLatest Flow를 처음 배울 때 우리는 대게 '코루틴으로 만드는 RxJava' 정도로 이해합니다.연산자를 체이닝하고, 마지막에 collect 를 붙이면 값이 흘러나옵니다. - 왜 Flow를 collect 할 때마다 API를 다시 호출하는가?- StateFlow와 SharedFlow는 뭐가 다른가, 언제 어느 걸 쓰는가- WhileSubscribed(5000) 의 5초는 대체 무슨 5초인가- Fragment에서 lifecycleScope.launch { flow.collect {} } ' 는 왜 위험한가 이 질문들의 답은 전부 하나의 축에서 갈림 (스트림이 Co..

개발 2026.09.07

Coroutine exception handling

1. 예외 전파 2. launch vs async 3. SupervisorJob4. CoroutineExceptionHandler5. CancellationException 1. 예외는 위로, 취소는 아래로모든 것의 출발점은 structured concurrency 코루틴은 부모-자식 Job 계층을 이룸.이 계층에서 예외와 취소는 반대 방향으로 흐름 자식 A에서 예외가 발생하면 1. 예외가 부모로 전파된다 (위로)2. 부모는 자기 자신을 취소한다3. 부모가 취소되면서 형제 B도 취소된다 (아래로)4. 다시 부모의 부모로 예외가 전파된다. 즉 하나가 실패하면 형제가 함께 죽는 것이 기본 동작입니다.이게 쿠로틴 예외 처리의 첫 번째 원칙이고, 나머지 모든 도구 (SupervisorJob, supervi..

개발 2026.09.04

structured concurrency

1. 원칙코루틴은 반드시 부모-자식 계층 구조 안에서 생명주기가 관리되어야 한다 라는 설계 원칙 핵심 규칙 3가지1. 부모는 모든 자식이 끝날 때까지 기다린다 - 부모 코루틴은 자식이 완료되기 전에 완료될 수 없음2. 부모가 취소되면 자식도 전부 취소된다 - 취소가 계층을 따라 아래로 전파3. 자식이 실패하면 부모도 실패한다 - 예외가 계층을 따라 위로 전파 (SupervisorJob으로 차단 가능) 이 구조 덕분에 누수되는 코루틴 (leaked coroutine)이 원천적으로 불가능해집니다.스레드 시절에 'fire-and-forget' 후 잊혀진 백그라운드 작업 문제를 언어 차원에서 해결한것 2. 매커니즘 Job 계층 val parent = launch { // 부모 Job 생성 ..

개발 2026.07.13

let, run, apply, also, with

핵심 원칙 * 객체를 this로 받고 + 람다 결과 반환 = run, with* 객체를 this로 받고 + 객체 자신 반환 = apply* 객체를 it으로 받고 + 람다 결과 반환 = let* 객체를 it으로 받고 + 객체 자신 반환 = also - this (수신 객체): 객체의 멤버를 직접 호출 -> 객체를 설정 / 구성하는 느낌- it (인자) : 객체에 이름을 붙여 참조 -> 객체를 사용 / 변환 하는 느낌- 람다 결과 반환: 변환 결과가 필요할 때 - 객체 자신 반환: 체이닝을 이어가거나 부수 효과 (로깅 등)을 끼워넣을 때 with 만 확장 함수가 아니라, 일반 함수 (with(obj) {} ) 차이가 있음 Scope function은 결국 람다 함수를 받는것,객체를 람다 안으로 넘겨 줄 ..

개발 2026.07.08

Delegation

1. 클래스 위임 상속보다 합성: Kotlin은 언어 차원에서 지원상속 -> 부모 클래스를 물려받는다합성 -> 다른 객체를 멤버로 품고 그 기능을 사용 // 상속: MyLogger는 ConsoleLogger"이다" class MyLogger : ConsoleLogger() // 합성: MyLogger는 logger를 "가진다" class MyLogger(private val logger: ConsoleLogger) { fun log(msg: String) = logger.log(msg) // 품고 있는 객체에 일을 시킴 }상속 문제? 1. 부모의 내부 구현에 강결합 부모를 고치면 자식 전부가 영향을 받음 -> 자식 30개면..

개발 2026.07.06

variance - in / out / invariant

variance란 Dog가 Animal의 하위 타입 일 때 , List가 List의 하위 타입이 되느냐에 문제 out T : T를 생산만 한다 (반환) -> 꺼내기만 하는 자판기in T: T를 소비만 한다 -> 넣기만 하는 쓰레기통T : 생산도, 소비도 한다 -> 넣고 빼는 상자 핵심 규칙 // out — 생산자. T를 반환 위치에만 쓸 수 있음 interface Producer { fun produce(): T // OK // fun consume(t: T) // 컴파일 에러! } // in — 소비자. T를 파라미터 위치에만 쓸 수 있음 interface Consumer { fun consume(t: T) // OK // fu..

개발 2026.06.30

sealed class, enum class, data class

enum class는 고정된 값의 집합 = 상수 data class는 데이터를 담는 그릇 = 값 객체sealed class 는 제한된 타입의 계층 = 상태/분기 enum class = 값이 고정되어 있을 때 enum class PaymentMethod { BANK_TRANSFER, E_WALLET, CASH;}인스턴스가 컴파일 타임에 확정, 런타임에 추가 불가각 값은 싱글톤 (하나의 인스턴스만 존재)values(), valueOf(), entries 제공 -> values()는 모든 값을 Array로 반환-> valuesOf()는 문자열로 값을 찾음 (없으면 예외)-> entires는 values()에 list버전 (성능 더 좋음) 각 값에 프로퍼티/메서드는 가능하지만 같은 형태만 가능 -..

개발 2026.06.26