2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

withContext

작성: sangseek | 게시 날짜: 2026/04/06 | 조회수: 37
[ 편집불가 ]

withContext는 Kotlin 코루틴에서 사용하는 일시중단 함수로, 현재 코루틴의 실행 컨텍스트(예: 디스패처)를 일시적으로 바꿔서 특정 블록을 실행하고 그 결과를 반환하는 역할을 합니다. 핵심 포인트는 다음과 같습니다. - 역할 - 지정한 CoroutineContext(보통 Dispatchers.IO, Dispatchers.Default, Dispatchers.Main 등)에서 블록을 실행한다. - 블록이 끝날 때까지 현재 코루틴은 일시중단되고, 결과를 받아 계속 실행한다. - 새로운 코루틴을 생성하지 않고(launch/async와 다르게) 같은 코루틴의 컨텍스트만 전환한다. - 특성 - suspend 함수이다. 따라서 반드시 코루틴 안에서 호출해야 한다. - 반환값을 블록에서 그대로 반환한다: val r = withContext(ctx) { ... } - 예외는 호출자에게 전파되며, 취소는 CancellationException 형태로 처리된다. - 전달한 컨텍스트는 현재 컨텍스트와 병합되며, 같은 키(예: Dispatcher, Job 등)를 가진 요소는 전달한 것으로 덮어쓴다. 따라서 Job을 바꿀 경우 구조적 동시성에 영향이 있을 수 있다. - withContext와 launch/async의 차이 - withContext: 일시중단하고 블록이 완료될 때까지 기다려 결과를 반환(동기적 대기, 같은 코루틴). - launch: 새로운 자식 코루틴을 생성하고 즉시 Job을 반환(비동기, 결과 없음). - async: 새로운 자식 코루틴을 생성하고 Deferred를 반환(비동기, 결과는 await로 획득). - 사용 예 - 블로킹 I/O를 다른 스레드로 오프로드할 때: suspend fun loadData(): String { return withContext(Dispatchers.IO) { // 파일/네트워크 등 블로킹 작업 } } - CPU 집약 작업을 Default 디스패처로 이동: val result = withContext(Dispatchers.Default) { heavyComputation() } - UI 갱신은 Main에서: withContext(Dispatchers.Main) { textView.text = "완료" } - 권장사항 / 주의점 - 블로킹 작업은 반드시 Dispatchers.IO 등 적절한 디스패처로 옮겨야 한다. - 빈번한 컨텍스트 전환은 성능에 악영향을 줄 수 있으므로 필요한 범위만 한정해서 사용한다. - 부모 코루틴의 취소가 자식에 전파되는 구조적 동시성을 이용하되, 의도적으로 분리하려면 컨텍스트에 새 Job을 추가하는 것이 가능한 대신 주의해야 한다(잘못 쓰면 부모 취소와 분리되어 메모리/작업 관리가 어려워질 수 있음). - UI 스레드 작업은 짧게 유지하고, 긴 작업은 항상 백그라운드로 옮긴다. 요약하면, withContext는 코루틴의 실행 컨텍스트(스레드/디스패처)를 안전하고 구조적으로 전환해서 특정 블록을 실행하고 결과를 반환하게 해 주는 도구입니다.
내용이 부정확하다면 싫어요를 누르세요.