View
오늘 알아 볼 것!!
오늘은 간단히 코루틴에 대해서 알아보려고 한다. 이번 포스트와 Rxjava 포스트는 안드로이드의 비동기가 필요할 때 많이 쓴다.
금일 글쓴이의 상태가 메롱이라 조금 오타가 있다면...이해주길 바란다. 예비군 너무 힘들다...ㅇㅅㅇ;;
코루틴?? 그게 뭔뎅?
코루틴은 현재 프로그래밍 언어에 구현되어 있으며 코틀린만의 고유한 개념은 아니라고 한다.
프로그래밍에서 루틴이란 프로그램의 흐름을 추상적으로 일컫는 말로, 크게 메인루틴과 서브루틴으로 나눌 수 있는데
예를 들어 메인함수에 의해 수행되는 프로그램의 흐름을 메인루틴이라고 하면 main함수 안에서 실행되는 개별 함수들에 의해 수행되는 흐름을 서브루틴이라 비유할 수 있다.
즉 루틴의 한 종류인 함수는 호출을 함으로써 그 내부에 진입하여 내부에서 처리를 수행하고, 처리가 끝나면 함수도 종료되는 구조를 가지고 있기 때문에 보통 루틴은 일직선적인 흐름을 가지고 있다고 한다.
하지만 코루틴은 일직선적인 흐름을 중간에 지연시켰다가(suspend) 다시 재시작(resume)이 가능하다.
즉 코루틴을 사용하게 되면 루틴이 실행 되었더라도 더 바쁜 루틴이 실행되는 동안 잠시 멈췄다가, 바쁜게 끝나면 재시작하여 나머지 작업을 끝내는 형태의 비동기 프로그래밍을 하는 것이다.(요녀석!!!Rxjava 못지 않은 보석같은 놈이잖아~)
또한 코루틴 자신 스스로가 메인루틴이 되면서도 서브루틴이 된다.(그래 너 혼자 다해라!!)
자 일단 코루틴의 간단한 개념부터 살펴왔다 그래도 이해가 잘 안될 것이다. 그렇다면 3가지 키워드만 일단 알고 가자!!
코루틴의 3가지 키워드!
- 협력형 멀티 태스킹
- 동시성 프로그래밍 지원
- 비동기 처리를 쉽게 도와줌
형렵형 멀티 태스킹
협력형 멀티태스킹이라고 거창하고 어렵운 단어가 보일 것이다. 하지만 우리는 이미 알고 있다.
위에서 다 봤기 때문이다.
프로그래밍 언어로 표현하자면 Co + Routine --> Co는 협력,함께라는 의미를 Routine은 하나의 태스크, 함수라고 생각하면된다.
즉 협력형 멀티태스킬 -> CoRoutine(코루틴) -> 협력하는 함수
위에서 설명했지만 Routine과 코루틴에 대해서 한번 더 자세히 설명하겠다.
위 사진을 보면 main()함수와 plusOne(value: Int)함수가 보일 것이다.
여기서 main()함수는 메인 루틴이되고 plusOne(value: Int)함수는 서브 루틴이 된다. 그리고 이것을 합쳐저 Routine이된다.
코드를 살펴보면 메인 쓰레드가 plusOne이라는 서브루틴에 진입하고 여러분들이 잘고 있듯이 맨 윗줄부터 실행되어 return문을 만나 서브루틴을 호출했던 부분으로 탈출한다. 그리고 진입점과 탈출점 사이에 쓰레드 블락이 되었다.
즉 plusOne()함수가 시작부터 끝날 때까지 그냥 그대로 쭉쭉 멈추지 않고 실행된다는 것이다.
그림으로 표현하자면 아래 그림과 같다.
아래 그림의 Sub routine A가 plusOne()함수라고 보면된다.
하지만 코루틴은 조금 다른다.
아래 사진을보자
(startCoroutine은 실제로 존재 X 그냥 이해를 위한 가짜 예시 함수이다.)
위 사진의 CoRoutine은 drawPerson()에는 언제든지 진입하고 탈출할 수 있는 자격이 주어지게 되고 코루틴 함수가 실행되다가
suspend가 붙은 drawHead()를 만나게 되면 잠시 탈출했다가 다른 코드들을 실행하다가 다시 돌아와서 drawHead()를 실행하고 또 다시 나가서 다른 것을 실핼했다가를 반복하다가 drawHead가 끝나면 그 아래 줄부터 실행되게 되는것이다.
아래 그림처럼 말이다.
솔직히 이해가 안되는 부분일 것이다.
간단히 비슷한 경우를 말하자면 부모님께서 집에서 요리를 하실 때랑 같다고 글쓴이는 생각한다.
부모님 요리를 하실 때 한번에 2,3가지 반찬을 만드시는 것을 보통 우리는 볼 때가 많을 것이다.(혹시 본적이 없다면....반성하자!!)
부모님들께서 요리를 하실 때 두가지 요리를 동시에 하시는 모습을 보신적이 있을 것이다. 그렇다 코루틴도 어떻게 보면 요리를 하는 거와 똑같다. 조금씩 동시에 여러일을 해서 한번에 완성하는 것이다.
동시성 프로그래밍 지원
동시성 프로그래밍 지원이라는 것은 간단히 말해서 코루틴은 하가지 스레드에서 여러가지 작업이 올라갈 수 있어 동시에 작업을 처리한다는 것이다.
이 부분은 쓰레드로 동시성을 지원한 것과 다른 만약 쓰레드로 동시성을 지원하게 되면 각각의 작업에 한개의 쓰레드가 붙게 되어 cpu는 해당 작업을 할때 각각의 작업에 붙어 있는 쓰레드를 점유 했다가 놓아줬다가 하면서 resource를 많이 잡하먹게 된다.
하지만 코루틴은 다르다. 한개에 쓰레드를 잡고 모든 일을 조금씩 동시에 처리하기 때문이다.
간단히 말해 우리가 왼손과 오른손을 쓰레드라고 놓고 머리를 cpu라고 가정한다면 동시에 2개의 같은 그림을 그릴 때 우리의 머리는 혼란이 온다. 왜냐하면 왼손과 오른손에 신경을 각각 썼다가 놯다가 반복하면서 그리기 때문이다. 하지만 우리가 코루틴이라면 오른손 쓰레드만 가지고 2개의 그림을 조금식 동시에 그리는 것이다.(양손잡이라 모르겟다면...ㅇㅅㅇ;;)
비동기 처리를 쉽게 도와줌
위에 두가지를 합치게 되면 비동기가 쉽게 이루어진다.
그래서 코루틴을 쓰는것이다. 즉 비동기 처리를 쉽게 도와주기 때문!!!!!
추후에 사용법에 대해서 알아보려고 한다.!
'TIL > 스터디' 카테고리의 다른 글
RoomDB (0) | 2024.03.14 |
---|---|
코루틴-2(Coroutine) (0) | 2024.03.07 |
Calendar 클래스 (0) | 2024.02.29 |
hilt가 무엇인디? (3) | 2024.02.27 |
안드로이드 Task(간단 포스트) (0) | 2024.02.26 |