*코루틴(Coroutine)
-스레드(Thread)를 경량화 한 것
-다른 언어에서 이미 사용되고 있는 동시성 프로그래밍 개념을 코틀린에 도입
-코루틴의 Co는 함께 또는 동시에 라는 의미를 가지고 있음
-실행 중인 스레드를 중단시키기 않기 때문에 하나의 스레드에 여러 개의 코루틴 존재 가능
-스레드는 단지 코루틴이 실행되는 공간을 제공하는 역할
-여러개의 코루틴 중 하나의 코루틴이 중단되어도 공간을 제공한 스레드는 계속 움직임
-코루틴을 사용하지 않고 Context Switching(스레드 간의 전환)이 자주 일어나면 성능저하 발생
-코루틴은 컨텍스트 스위칭을 하나의 스레드에서 처리하므로 성능저하가 적고 동일구조에서 스레드보다 훨씬 적은 자원 소모
*Context Switching(컨텍스트 스위칭)
-안드로이드에서 스레드간의 전환
-원래 연산 처리 프로세스를 교체하는 것을 말함
--OS에서 여러 개의 프로세스를 한 번에 처리하고자 할 때 CPU는 이것들을 시간 순서로 잘게 나누어 처리함
--이 처리를 할 때 프로세스가 변경되는 시점에 바로 이전 프로세스의 현재 상태 정보를 저장해둔 후 변경
-컨텍스트 스위칭이 빈번하면 성능저하가 발생
-코루틴의 컨텍스트 스위칭은 연산처리 프로세스 교체 개념을 소프트웨어적으로 진화시켜 성능저하가 발생하지 않도록 설계됨
*코루틴(Coroutine) 사용
-버전에 따른 코루틴 설정(의존성)
-코루틴 실행 스코프(GlobalScope, CoroutineScope)
-launch와 async
-launch와 async의 상태관리(cancel(), join())
-async의 반환값 처리(await())
-suspend
-suspend 함수 사용 시 디스패처 분리(withContext)
*버전에 따른 코루틴 설정 : 의존성
-안드로이드 스튜디오 4.1 버전은 코루틴이 내장되어 있지만 4.2부터는 의존성을 추가하여 사용
-코루틴을 지원 확인방법 : MainActivity.kt - onCreate() - CoroutineScope를 입력했을 때 자동완성된다면 추가하지 않아도 됨
-코루틴 최신 버전 : https://developer.android.com/kotlin/coroutines
*코루틴 실행 스코프(GlobalScope, CoroutineScope)
-코루틴은 정해진 스코프 안에서 실행
-코루틴 실행 스코프.launch{}를 사용해 코루틴을 실행함
-코루틴 실행 스코프 : 글로벌스코프(GlobalScope), 코루틴스코프(CoroutineScope)
--글로벌스코프 : 앱의 생명주기와 함께 동작, 앱 실행 중 별도의 생명주기 관리 필요하지 않음, 장시간 실행되어야 하는 코루틴에 사용
--코루틴스코프 : 버튼을 클릭해 서버정보를 가져오거나 파일을 여는 용도 시 사용, 필요할 때만 열고 완료되면 닫을 때 사용
---코루틴 스코프 사용 시 괄호안에 Dispatchers(디스패처) 상수값 사용
---Dispatcher : 코루틴이 실행될 스레드를 지정하는 것( 보통 IO, Main을 조합해 사용함)
*launch와 async
-코루틴은 launch와 async으로 시작
-launch : 상태관리 가능
-async : 상태를 관리하고 연산 결과까지 반환 받음
-호출하는 것만으로 코루틴 생성가능하며 반환되는 잡(Job)을 변수에 저장하여 상태관리용으로 사용가능
-생성된 코루틴에서 상태관리 메서드 호출 시 코루틴의 실행을 멈추거나 동작 지연 가능 : cancel(), join()
*launch와 async의 상태관리(cancel(), join())
-cancel() : 코루틴의 동작을 멈추는 상태관리 메서드, 하나의 스코프 안에 여러 개의 코루틴이 있을 시 하위 코루틴 모두 동작을 멈춤
--btnStop버튼 클릭시 job코루틴 하위의 job1코루틴도 동작을 멈추게 됨
-join() : 여러개의 코루틴이 순차적으로 실행되게 설정, launch사용 시 {}블록 끝에 사용
--코루틴 스코프 안의 2개의 스코프 중 join() 메서드로 인해 앞의 코루틴 실행 후 두 번째 코루틴 실행
--suspend 함수처럼 동작함
*async의 반환값 처리(await())
-코루틴 스코프의 연산 결과를 받아서 사용가능
--시간이 오래 걸리는 2개의 코루틴을 async로 선언하고 결과값 처리하는 곳에서 await함수 사용
--결과처리 완료 후 await을 호출한 줄의 코드 실행
*suspend
-코루틴을 가장 잘 설명할 수 있는 키워드
-코루틴 안에서 호출 시 이전까지의 코드 실행이 멈추고 suspend함수 처리가 먼저 완료된 후 멈춰있던 곳에서 다음 코드 실행
--suspend 함수 호출 : 코드1실행 하고 코루틴 중단 후 suspend키워드로 선언한 함수 실행완료 뒤 코드2실행
--suspend키워드로 선언한 subRoutine()함수는 코루틴 스코프 안에서 자동으로 백그라운드 스레드처럼 동작
--호출한 측의 코드를 잠시 멈추고 실행하며 스레드의 중단 없이 실행
--코루틴에서는 부모 루틴의 상태 값 저장 후 subRoutine()함수를 실행하고, 함수 종료 시 부모 루틴의 상태 값을 복원하는 형태로 동작하여 스레드에 영향을 주지 않음
*suspend 함수 사용 시 디스패처 분리(withContext)
-withContext: suspend 함수를 코루틴 스코프에서 호출 시 호출한 스코프와 다른 디스패처를 사용할 때 사용
--호출 측 코루틴은 UI제어(Main 디스패처 사용)하고 suspend함수는 디스크에서 파일을 읽어와야(IO 디스패처 사용)하는 경우
--withContext를 사용해 호출되는 함수의 디스패처 변경 가능, 반환값도 변수에 저장해 사용가능
이 포스팅에 작성한 내용은 고돈호, ⌜이것이 안드로이드다⌟, 한빛미디어(주), 2022 에서 발췌하였습니다.
'Android App > Kotlin' 카테고리의 다른 글
4대 컴포넌트-서비스(Service), 실행방식(스타티드, 바운드, 포어그라운드 서비스) (0) | 2022.12.02 |
---|---|
코루틴(Coroutine)-구현하기(이미지 다운로드 앱) (0) | 2022.11.30 |
스레드(Thread)-구현하기(타이머 앱) (0) | 2022.11.29 |
스레드(Thread)-루퍼, 핸들러, 메시지 (0) | 2022.11.29 |
스레드(Thread)-메인 스레드, 백그라운드 스레드 (0) | 2022.11.29 |