Kotlin 10

[Kotlin 코루틴] 구조화된 동시성

구조화된 동시성의 원칙비동기 작업을 구조화함으로써 비동기 프로그래밍을 보다 안정적이고 예측할 수 있게 만드는 원칙코루틴은 구조화된 동시성의 원칙을 사용해 비동기 작업인 코루틴을 부모-자식 관계로 구조화함으로써 코루틴이 보다 안전하게 관리되고 제어하도록 지원부모 코루틴을 만드는 코루틴 빌더의 람다식 속에서 새로운 코루틴 빌더를 호출하면 코루틴을 부모-자식 관계로 구조화할 수 있음 구조화된 코루틴의 특징부모 코루틴의 실행 환경이 자식 코루틴에게 상속됨작업을 제어하는 데 사용됨부모 코루틴이 취소되면 자식 코루틴도 취소됨부모 코루틴은 자식 코루틴이 완료될 때까지 대기CoroutineScope를 사용해 코루틴이 실행되는 범위를 제한 가능 실행 환경 상속 1. 부모 코루틴의 실행 환경 상속부모 코루틴은 자식 코루틴..

[Kotlin 코루틴] CoroutineContext 정리

서론대표적인 코루틴 빌더 함수인 launch와 async의 코드를 보면 다음과 같습니다.  위 코드 스니펫에서 볼 수 있다시피 launch와 async 함수는 매개변수로 context, start, block을 가집니다.context의 타입은 CoroutineContextstart의 타입은 CoroutineStartlaunch 함수의 block은 Unit을 반환하는 람다식async 함수의 block은 제네릭 타입 T를 반환하는 람다식 CoroutineContext는 코루틴을 실행하는 실행 환경을 설정하고 관리하는 인터페이스로 CoroutineContext 객체는 다음의 객체들을 조합해 코루틴의 실행 환경을 설정합니다.CoroutineDispatcherCoroutineNameJobetc. 정리하자면 Cor..

[Kotlin 코루틴] async와 Deferred

서론launc 코루틴 빌더를 통해 생성되는 코루틴은 기본적으로 작업 실행 후 결과를 반환하지 않지만async 코루틴 빌더를 통해 생성된 코루틴으로부터 결괏값을 수신받을 수 있음async 함수를 사용하면 결괏값이 있는 코루틴 객체인 Deferred가 반환됨Deferred 객체를 통해 코루틴으로부터 결괏값을 수신할 수 있음 async 사용해 결괏값 수신하기 1. async 사용해 Deferred 생성하기async 함수는 launch 함수와 유사하지만 다음과 같은 차이점이 존재함launch는 코루틴이 결괏값을 직접 반환할 수 없기 때문에 Job 객체를 반환async는 코루틴의 결괏값을 직접 반환하고 결괏값을 담아 반환하기 위해 Deferred 타입의 객체를 반환 * Deferred는 Job과 같이 코루틴을 추..

[Kotlin 코루틴] 코루틴 빌더와 Job 정리

코루틴 빌더와 Job 객체 개요코루틴을 생성하는 데 사용하는 함수ex) runBlocking, launch 모든 코루틴 빌더 함수는 코루틴을 만들고 코루틴을 추상화한 Job 객체를 생성코루틴은 일시 중단할 수 있는 작업으로 실행 도중 일시 중단된 후 이후 이어서 실행될 수 있음코루틴을 추상화한 Job 객체는 이에 대응해 코루틴을 제어할 수 있는 함수와 코루틴의 상태를 나타내는 상태 값들을 외부에 노출시킴   부연 설명launch 함수 호출 시 코루틴 생성Job 객체가 생성되고 반환되는 것을 확인 가능 join을 사용한 코루틴 순차 처리Job 객체는 순차 처리가 필요한 상황을 위해 join 함수를 제공join 함수를 통해 먼저 처리되어야 하는 코루틴의 실행이 완료될 때까지 호출부의 코루틴을 일시 중단하도록..

[Kotlin 코루틴] CoroutineDispatcher 정리

Dispatcher란?dispatch와 -er의 합성어dispatch의 `보내다`라는 뜻에 -er이 붙어 `무언가를 보내는 주체`라는 뜻 CoroutineDispatcher`코루틴을 보내는 주체`코루틴은 일시 중단이 가능한 `작업`이기 때문에 쓰레드가 있어야 실행될 수 있음CoroutineDispatcher는 코루틴을 쓰레드로 보내 실행시키는 역할코루틴을 쓰레드로 보내는 데 사용할 수 있는 쓰레드나 쓰레드 풀 가짐코루틴을 실행 요청한 쓰레드에서 코루틴이 실행되도록 만들 수 있음 CoroutineDispatcher 동작 과정CoroutineDispatcher 객체에 코루틴의 실행이 요청됨CoroutineDispatcher 객체는 실행 요청받은 코루틴을 작업 대기열에 적재시킴CoroutineDispatche..

[Kotlin] CoroutineScope

CoroutineScopeCoroutine들에 대한 scope를 정의하며 scope에는 여러 Coroutine들 포함자식 Coroutine들에 대한 생명주기를 관리하며 자식 Coroutine들이 모두 완료되어야만 scope도 완료되었다고 처리CoroutineScope의 coroutineContext에는 꼭 Job을 포함해야 함  1. CoroutineScope 함수CoroutineScope 함수를 이용해 CoroutineScope 생성  부연 설명인자로 주어진 context에 Job이 포함되었는지 확인포함되어 있지 않다면 Job을 생성하여 추가하고 ContextScope에 전달여기서 ContextScope는 CoroutineScope의 단순한 구현체  부연 설명EmptyCoroutineContext를 통..

Kotlin 2024.10.03

[Kotlin] CoroutineContext

CoroutineContext코틀린에서 코루틴을 실행할 때 사용하는 컨텍스트를 나타내는 인터페이스Spring MVC와 같이 thread-per-request 모델에서는 ThreadLocal을 사용하지만 Reactor나 코루틴처럼 각 요청을 처리할 때마다 수행하는 쓰레드가 변경되기 때문에 특정 쓰레드에 종속되는 ThreadLocal에 접근 불가이에 따라 Reactor에서는 Context, 코루틴에서는 CoroutineContext를 사용하여 파이프라인 context를 저장CoroutineContext는 코루틴의 동작을 커스터마이징하고, 실행 쓰레드나 예외 처리, 디버깅 정보 등을 포함하는 요소들을 담고 있음 1. Continuationsuspend 함수는 다양한 쓰레드에서 실행되기 때문에 ThreadLoc..

Kotlin 2024.10.03

[Kotlin] 코루틴 (Coroutine) 기초

1. suspend 함수코틀린 코루틴에서 비동기적으로 실행할 수 있는 특수한 함수로코루틴 내에서 중단 가능(suspension) 한 작업을 처리할 수 있도록 설계됨실행 일시 중단 가능나중에 다시 실행 재개할 수 있는 특징 지님 코루틴 내에서 네트워크 요청이나 파일 읽기/쓰기와 같이 특정 작업을 대기해야 할 때 CPU 리소스를 낭비하지 않고, 효율적으로 다른 작업 처리 가능 1.1 suspend 함수 특징코루틴 내에서만 실행 가능: suspend 함수는 오직 코루틴 내에서만 호출될 수 있으며 코루틴 범위 밖에서는 직접 호출 불가중단 및 재개 가능: 앞서 언급했다시피 suspend 함수는 중간에 실행을 멈추고, 나중에 다시 이어서 실행 가능비동기 작업 처리: suspend 함수는 일반 함수와 달리 비동기 작..

Kotlin 2024.10.02

[Kotlin] 코루틴 (Coroutine) 개요

코루틴Kotlin Serialization, Kotlin Lincheck과 함께 코틀린에서 지원하는 공식 라이브러리로 동시성을 지원하는 라이브러리기존의 쓰레드 기반 비동기 프로그래밍의 복잡성과 성능 한계를 극복하기 위해 설계되었으며, 동시성을 처리하는 강력한 도구비동기 non-blocking으로 동작하는 코드를 동기 방식으로 작성할 수 있도록 지원단, 컴파일된 후의 결과는 동지적으로 동작하지 않음 CoroutineContext를 통해 Dispatcher, Error Handling, 그리고 ThreadLocal 등을 지원CoroutineScope를 통해 Structured Concurrency와 Cancellation 제공Flow, Channel 등의 심화 기능 제공 1. kLogger코틀린에서 로깅을 ..

Kotlin 2024.10.02

[Kotlin] lateinit과 by lazy의 차이점

개요 회사와 연계해서 진행하는 패스트캠퍼스 코틀린 안드로이드 강의를 듣는 도중 생소한 개념인 lateinit과 by lazy 키워드가 등장했습니다. 다행히 holika님이 잘 정리해주신 글이 있어 개념은 이해할 수 있었지만 아직 정확한 사용처는 파악하지 못했습니다. 프로젝트를 진행하면서 사용하는 케이스가 나왔을 때 해당 게시글에 추가 작성하도록 하겠습니다. https://holika.tistory.com/entry/%EB%82%B4-%EB%A7%98%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-Kotlin-lateinit%EA%B3%BC-by-lazy%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90 [내 맘대로 정리한 Kotlin] lateinit과..

Kotlin 2022.07.13