![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Myliv/btsLJ6gqi6X/NIHbtdhdnGlBfaDYg1EEfK/img.png)
지난 포스팅에서 구조화된 동시성의 특성에 대해 배웠다.자식 코루틴은 부모 코루틴으로부터 컨텍스트를 상속받는다.부모 코루틴은 모든 자식 코루틴이 작업을 마칠 때까지 기다린다.부모 코루틴이 취소되면 자식 코루틴도 취소된다.자식 코루틴에서 에러가 발생하면, 부모 코루틴도 에러로 소멸된다.구조화된 동시성의 특성은 Job 컨텍스트와 관련이 있다.Job은 코루틴을 취소하고, 상태를 파악하는 등 다양하게 사용될 수 있다. Job이란 무엇인가?잡은 수명을 가지고 있고 취소 가능하다.Job은 인터페이스지만 구체적인 사용법과 상태를 가지고 있기 때문에 추상 클래스처럼 다룰 수도 있다. 잡의 수명은 상태로 나타낸다. 위 그림은 잡의 상태와 상태 변화를 나타낸 도식도이다.ActiveActive 상태에서는 잡이 실행되고 코루..
fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = Coroutinestart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job { ...}코루틴 빌더 함수의 시그니처 첫 번째 파라미터가 CoroutineContext라는 사실을 알 수 있다.빌더 함수의 리시버뿐만 아니라 마지막 인자의 리시버도 CoroutineScope 타입이다. interface CoroutineScope { val coroutineContext: CoroutineContext}CoroutineScope는 CoroutineConte..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b0dTSW/btsLJBHFhc1/5fvfj5SmNgro10juGZ2B5k/img.png)
중단 함수는 Continuation 객체를 다른 중단 함수로 전달한다.따라서 중단 함수는 일반 함수를 호출할 수 있지만, 일반 함수는 중단 함수를 호출할 수 없다.모든 중단 함수는 다른 중단 함수에 의해 호출되어야 한다. 이때 중단 함수를 시작하는 지점이 코루틴 빌더다.코루틴 빌더는 일반 함수와 중단 함수를 연결시키는 다리가 된다.kotlinx.coroutines 라이브러리가 제공하는 필수적인 코루틴 빌더 세 가지를 탐색해 보자.launchrunBlockingasync launch 빌더thread 함수를 호출하여 새로운 스레드를 시작하는 것과 비슷하다.코루틴을 시작하면 별개의 작업으로 실행된다.fun main() { GlobalScope.launch { delay(1000L) ..
코틀린 언어에서 자체적으로 지원하는 부분(컴파일러의 지원과 코틀린 기본 라이브러리의 요소)코틀린 코루틴 라이브러리(kotlinx.coroutines)코루틴은 두 가지로 구성되어 있다. 코틀린 언어 차원에서는 자유도를 보장하기 위해 코루틴을 최소한으로 지원하고 있다.다른 프로그래밍 언어에서 동시성을 구현한 스타일을 이식 하기 위해 사용할 수 있지만, 직접 다루기 쉽지는 않다.그 예로 suspendCoroutine()이나 Continuation 등이 있다.애플리케이션 개발자들보다는 라이브러리 개발자들에게 적합하다. 언어 차원에서 지원하는 것과 별개로 kotlinx.coroutines 라이브러리가 있다.이 라이브러리를 사용하려면 프로젝트에 별도로 의존성을 추가해야 한다.라이브러리는 코틀린 언어 차원에서 코루..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/s4xZU/btsLJMBMOFl/wEoPw8v1hxoHCHXAqNgoO0/img.png)
Continuation 전달 방식Continuation은 함수에서 함수로 인자를 통해 전달된다. Continuation은 마지막 파라미터로 전달된다.suspend fun getUser(): User?suspend fun setUser(user: User)suspend fun checkAvailability(flight: Flight): Boolean위 중단 함수의 실제 함수 시그니처는 아래와 같다.fun getUser(continuation: Continuation): Any?fun setUser(user: User, continuation: Continuation): Anyfun checkAvailability( flight: Flight, continuation: Continuation,)..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dCbmr9/btsLIBggAES/nRKj7I3C5iiBKSXKT3eKGk/img.jpg)
2024년 마지막날에 쓰려고 했던 회고글을 이제서야 올린다.과제 전형이 겹쳐 미루다가 드디어 작성한다. 나의 2024년 == 우아한테크코스2024년을 한 단어로 정의하자면 무조건 "우아한테크코스"일 것이다.개발뿐만 아니라 모든 내 경험과 성장은 우테코로부터 기반했다.우테코 합격 후 했던 고민들이 무색하게, 2024년 겪었던 모든 경험들이 나를 성장시키는 연료가 되었다. 흐르는 대로 살아보기갓 25살이 된 나는 가장 불안한 시기를 지났다.자신감도 없고 자존감도 낮았다. 쉽게 불안해했다. 와중에 완벽주의적 성향도 강했다.이런 상태로 우테코에 들어갔을 땐, 마음에 소용돌이가 치는 것 같았다.경쟁이 없는 환경에서도 나는 1등을 하고 싶었다. 하지만 이렇게 스스로를 몰아붙이며 10개월을 버티는 건 말도 안..
중단 함수는 코틀린 코루틴의 핵심이다.코루틴을 중단한다는 건 실행을 중간에 멈추는 것을 의미한다.코루틴은 중단되었을 때 Continuation 객체를 반환한다. Continuation을 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있다.코루틴과 반대로 스레드는 저장이 불가능하고 멈추는 것만 가능하다.코루틴과 스레드는 확연히 다르다. 코루틴이 훨씬 강력한 도구다. 중단했을 때 코루틴은 어떤 자원도 사용하지 않는다.코루틴은 다른 스레드에서 시작할 수 있고, Continuation 객체는 직렬화와 역직렬화가 가능하며 다시 실행될 수 있다. 재개중단 함수는 말 그대로 코루틴을 중단할 수 있는 함수다.즉, 중단 함수가 반드시 코루틴이나 다른 중단 함수에 의해 호출되어야 한다. suspend fun mai..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/doBZp8/btsLINgjuvM/hsEJyOIA2KXjV3uDxKBaK0/img.png)
왜 중단이 필요한지, 중단이 어떤 것인지 알아보기 위해 시퀀스의 작동 방식과 시퀀스 빌더를 알아보자. 시퀀스의 특징 코틀린에서는 제너레이터 대신 시퀀스를 생성 할 때 사용하는 시퀀스 빌더를 제공한다.코틀린의 시퀀스는 List나 Set과 같은 컬렉션이랑 비슷한 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연(lazy) 처리를 한다.요구되는 연산을 최소한으로 수행한다.무한정이 될 수 있다. (-> while(true))메모리 사용이 효율적이다.sequence()라는 함수를 이용해 값을 순차적으로 계산하고 필요할 때 반환하는 빌더를 정의한다.시퀀스의 람다 표현식 내부에서는 yield() 함수를 호출하여 시퀀스의 다음 값을 생성한다.val seq = sequence { yield(l) yiel..