-
서브 루틴과 코루틴Programming🧑💻/Cpp 2025. 2. 13. 20:05
루틴이란?
프로그래밍에서 루틴은 프로그램의 실행흐름을 의미합니다.
모든 프로그램은 하나 이상의 루틴으로 구성되어 있으며, 이러한 루틴들이 어떻게 상호작용하는지에 따라 프로그램의 동작이 결정됩니다.
서브 루틴 (subroutine)
서브 루틴은 가장 일반적인 프로그램 실행 흐름의 형태입니다.
- 계층적 구조 : 서브루틴은 호출자-피호출자의 명확한 계층 관계를 가집니다. 메인 함수가 서브루틴을 호출하면, 서브 루틴은 메인함수에 종속됩니다. .
- 단방향 제어 흐름 : 제어 흐름이 항상 호출자에서 피호출자로 전달되며, 작업이 완료되면 다시 호출자로 돌아옵니다.
- 동기적 실행 : 서브루틴이 실행되는 동안 호출자는 대기 상태가 되며, 서브 루틴이 완료될때까지 다음 작업을 수행할 수 없습니다.
def sub(): print("abc") print("def") print("ghi") def main(): print("123") sub() print("456") print("789") # main 함수 실행 main()
main 함수가 실행되면 다음과 같은 순서로 코드가 진행됩니다
먼저 main 함수는 "123"을 출력합니다. 그 다음 sub 함수를 호출하게 되는데, 이때 프로그램의 실행 흐름이 잠시 sub 함수로 넘어갑니다. sub 함수는 main 함수 안에서 실행되는 하나의 작은 사이클이 됩니다.
sub 함수는 "abc", "def", "ghi"를 순서대로 출력한 후, 다시 main 함수의 호출 지점으로 돌아옵니다. 이것이 바로 서브루틴의 특징입니다 sub 함수의 시작과 끝이 모두 main 함수의 한 지점에 연결되어 있는 것입니다.
sub 함수가 완료되면 실행 흐름은 다시 main 함수로 돌아와서 남은 코드를 실행합니다. "456"과 "789"를 차례로 출력하고 main 함수가 종료됩니다. 따라서 최종 출력 결과는 다음과 같은 순서로 나타납니다:
123 abc def ghi 456 789
이처럼 서브루틴은 마치 main 함수 안에 있는 작은 순환 고리처럼 동작하며, 항상 호출된 지점으로 돌아와 메인 프로그램의 흐름을 이어가게 됩니다.
코루틴
코루틴은 '협력하는 루틴'이라는 의미로, 서브루틴과는 다른 특징을 가집니다.
- 대등한 관계 : 코루틴들은 서로 동등한 위치에서 협력하며, 계층적 종속 관계가 없습니다.
- 양방향 제어 흐름 : 코루틴들은 서로 제어권을 주고 받을 수 있으며, 실행 중간에 다른 코루틴으로 전환할 수 있습니다.
- 상태 보존 : 코루틴은 실행이 중단된 지점의 상태를 보존하고 있다가, 다시 실행될 때 해당 시점부터 이어서 실행할 수 있습니다.
def co(): print("abc") yield print("def") yield print("ghi") yield def main(): obj = co() print("123") next(obj) print("456") next(obj) print("789") next(obj) # main 함수 실행 main()
co 함수는 일반적인 서브루틴과 다르게 yield 문을 사용합니다. yield는 함수의 실행을 일시적으로 중단하고 제어권을 main 함수로 돌려주는 역할을 합니다. 중요한 점은 함수의 상태가 보존된다는 것입니다.
실행 순서를 자세히 살펴보면:
- main 함수에서 obj = co()를 실행하면 코루틴 객체가 생성됩니다. 아직 co 함수의 코드는 실행되지 않습니다.
- "123"이 출력됩니다.
- next(obj)가 호출되면 co 함수가 시작되어 "abc"를 출력하고 첫 번째 yield에서 멈춥니다. 제어권이 다시 main 함수로 돌아갑니다.
- main 함수는 "456"을 출력합니다.
- 두 번째 next(obj)가 호출되면 co 함수는 중단된 지점에서 다시 시작하여 "def"를 출력하고 두 번째 yield에서 멈춥니다.
- main 함수는 "789"를 출력합니다.
- 마지막 next(obj)로 co 함수는 다시 시작되어 "ghi"를 출력하고 마지막 yield에서 멈춥니다.
최종 출력은 다음과 같습니다.
123 abc 456 def 789 ghi
서브루틴과 달리, 코루틴은 마치 대화하듯이 main 함수와 co 함수가 번갈아가면서 실행됩니다. 각각의 yield 지점에서 co 함수는 자신의 상태를 보존한 채로 잠시 실행을 멈추고, 필요할 때 다시 해당 지점부터 실행을 재개할 수 있습니다. 이것이 바로 코루틴의 "협력적인 실행" 특징입니다.
상태 보존은 코루틴이 자신의 실행 컨텍스트(변수값, 실행 위치 등)를 잃지 않고 유지하면서, 필요할 때마다 중단과 재개를 할 수 있게 해주는 중요한 특징입니다.
'Programming🧑💻 > Cpp' 카테고리의 다른 글
헤더 전용 라이브러리는 뭐고 언제 쓸까? (0) 2025.04.04 상태기계와 코루틴 프레임 (0) 2025.02.14 Macro가 뭘까? (0) 2025.02.12 빌드 과정과 #include의 역할 이해하기 (0) 2025.02.12 헤더파일은 뭐고 왜 필요한가? (0) 2025.02.12