✨ 오늘 공부한 것
- 코루틴 개념 학습 - 컴포즈 강의
코틀린에는 코루틴이라는 자식이 있다. 보통 경량화 된 스레드, Light-Weight Thread라고 말한다. 즉, 하나의 스레드 안에서도 또 나눠서 여러 개의 코루틴을 사용할 수 있다는 개념이다.
나는 그냥 “코루틴” 이라는 단어를 구글에서 새롭게 만든 줄 알았는데 1958년부터 이미 존재했고, 적용되던 개념이었다. 게다가 “루틴”이라는 개념이 있고, 루틴은 다시 메인 루틴과 서브 루틴으로 나뉜다고 한다.
오늘은 루틴, 서브 루틴, 메인 루틴, 코루틴까지! 용어 정리를 해볼 예정이다.
모닝 루틴 혹은 학습 루틴처럼 우리가 평소에 사용할 때에는 일상 생활에서 반복적으로 하는 일들을 특정한 패턴으로 진행하고 있는 것의 의미로 쓰인다. 그렇다면 프로그래밍에서 루틴의 뜻은 무엇일까? 사전에는 컴퓨터 프로그램의 일부로서, 특정한 일을 실행하기 위한 일련의 명령이라 나와있다. 너무 사전적이니 다르게 말해보자면, 어떤 작업을 정의한 명령어의 집합이라고 할 수 있겠다.
여기서 어떤 작업을 정의한 명령어의 집합을 함수로 이해 할 수 있겠고, 프로그램은 이러한 함수들로 이루어져있다. 즉, 하나의 프로그램은 여러 루틴들의 조합으로 이루어진다.
위에서도 말했듯이 루틴은 메인 루틴과 서브 루틴으로 나뉜다. 메인 루틴은 보통 main 함수에 의해 실행되는 프로그램의 흐름을 말하고, 서브 루틴은 main 함수 내부에서 실행되는 개별 함수들에 의해 실행되는 흐름을 말한다.
fun main() {
// Main Routine
val myNumbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// oddSum > evenSum 순차적 실행
val myOddSum = myNumbers.oddSum()
val myEvenSum = myNumbers.evenSum()
}
// Sub Routine
fun Array<Int>.oddSum() = this.fold(0) { sum, n -> if (n % 2 != 0) sum + n else sum }
fun Array<Int>.evenSum() = this.fold(0) { sum, n -> if (n % 2 == 0) sum + n else sum }
코루틴은 메인이 되는 루틴과 별도로 진행이 가능한 루틴을 말한다. 서브 루틴과 동일한.. 것 같지만 아니다.
먼저 서브 루틴이다. 메인 루틴에서 서브 루틴을 호출하게 되면, 서브 루틴의 맨 처음 부분에 진입해 코드를 쭉쭉 실행한 후 return 문을 만나 메인 루틴의 원래 호출 위치로 돌아온다. 즉, 단일 진입 지점에서 시작하고 단일 반환 지점에서 종료된다.
다음은 코루틴이다. 코루틴은 return 문이 없더라도 임의의 지점에서 동작을 중지할 수 있으며, 이후에 해당 지점에서부터 실행을 재개할 수 있다. 즉, 진입 지점과 반환 지점이 여러 개이다.
정리해보자면, 서브 루틴은 무조건 순차적으로 수행되어야 하지만 코루틴은 서로 번갈아가며 조금씩 작업을 수행해 다른 루틴들과 같이(Co) 수행될 수 있다. 그래서 이름도 같이 수행되는 루틴인 Co-routine인 것이다.