Apple is Apple
article thumbnail

일일 회고

 

코틀린 비동기 프로그래밍의 꽃 Coroutine을 공부하는 날이다.  비동기 프로그래밍에 RxJava, RxKotlin, RxAndroid 등 Reactive 라이브러리가 있지만 (사실 공부해 본 적은 없다..ㅎ)   Kotlin이 공식적으로 사용하고 구글이 권장하는 Coroutine이다.

 

Coroutine을 공부하기 전 "비동기"에 대해 이해해야 하는데 간단하게 생각할 수 있지만 깊게 들어가면 OS 지식이 꽤 필요한 부분이다.. 

 

OS를 다시 한번 복습해보는 시간을 한번 가져야 될 것 같고, 이어서 Coroutine도 계속 학습해야 할 것 같다. (Coroutine 이론도 양이 상당? 한 것 같다.)

 

+ 선택심화과제를 진행 중이다. 확실히 기본과제보다는 어렵다. 


오늘의 Keyword

  • asyncrhoronous programming
  • Kotlin Coroutine

비동기 프로그래밍

작업을 하나씩 순서대로 수행하는 행위인 동기적 프로그래밍의 반대 개념으로 여러 작업을 동시에 실행하는 것을 뜻한다.

여러 로직이 동시 수행되며 다른 로직들의 완료와 관계없이 실행되는 방식이다.

 

Thread & Coroutine

Process

  • 프로그램이 메모리에 올라가 실행되어 있는 상태   

Thread
   
     Process 보다 더 작은 작업 단위

  • Task(작업) 단위 : Thread
    - 각 작업에 Thread를 할당
    - 각 Thread는 자체 Stack 메모리를 가지며, JVM Stack 영역을 차지함
  • Context Switching
    - Blocking: Thread1이 Thread2의 결과가 나올 때까지 기다려야 한다면 Thread1 은 Blocking이 되어 사용하지 못한다.

Coroutine

최적화된 비동기 함수를 사용
효율적으로 자원 할당이 가능
Thread보다 가볍게 사용할 수 있어 Light-Weighted Thread라고도 함

Task 단위 : Object(Coroutine)

  • 각 작업에 Object(Coroutine)를 할당
  • Coroutine은 객체를 담는 JVM Heap 영역에 적재됨

Context Switching -> No Context Switching

  • 코드를 통해 Switching 시점을 보장함
  • Suspend is NonBlcoking: Coroutine1이 Coroutine2의 결과가 나올 때까지 기다려야 한다면 > Coroutine1은 Suspend 되지만, Coroutine1을 수행하던 Thread는 유효함
    Coroutine2도 Coroutine1과 동일한 Thread에서 실행할 수 있음

비동기 처리 로직을 위해 콜백함수를 연속해서 야기되는 문제인 콜백 지옥 해소 

Suspend(일시 중단 함수)

  • fun 키워드 앞에 suspend키워드를 붙여서 함수를 구성하는 방법
  • 람다를 구성하여 다른 일시 중단 함수를 호출(runBlocking, launch, async...)

Coroutine Dispatcher

  • 코루틴을 시작하거나 재개할 스레드를 결정하기 위한 도구
  • 모든 Dispatcher는 CoroutineDispatcher 인터페이스를 구현해야 함

Coroutine Builder

  • async()  - 결과가 예상되는 코루틴 시작에 사용(결과를 반환함)
    • 전역으로 예외 처리 가능
    • 결과, 예외 반환 가능한 Deffered 타입으로 반환, 추후 await로 처리하여 대기할 수 있는 코드를 구현할 수 있음

  • launch() - 결과를 반환하지 않는 코루틴 시작에 사용(결과 반환 X)
    • 자체/자식 코루틴 실행을 취소할 수 있는 Job 객체 반환

  • runBlocking()  - Blocking 코드를 일지 중지(Suspend) 가능한 코드로 연결하기 위한 용도
    • main함수나 Unit Test 때 많이 사용됨
    • 코루틴의 실행이 끝날 때까지 현재 쓰레드를 차단함

 

 

 

 

profile

Apple is Apple

@mjjjjjj