코루틴(Coroutine)이란

 일반적 서브루틴과 다르게 다양한 진입접과 다양한 탈출점이 있는 루틴이다. 일반적 서브 루틴이란 메인 루틴에서 호출된 함수나 메서드가 호출된 시점부터 시작되어 return되는 지점까지 진행되는 것을 의미하는데 코루틴은 다양한 진입점을 가지고 다양한 탈출점이 있어 메모리를 보다 효율적으로 사용할 수 있게하는 것이다. 예를들어, A와 B라는 Task가 있을 때 각각의 Task들의 진입점과 탈출점을 쪼개어 [ABABABAB]와 같이 처리한다는 것이다.

 

쓰레드(Thread)란

 앞서 말한 Task의 처리경로로 이해하면 편하다. 1개의 Task는 한개의 쓰레드에 할당되어 처리된다고 생각했을 때 각각의 쓰레드를 병렬적으로 구성하여 각각의 태스크를 동시에 처리할 수 있다. 이 때, 쓰레드는 프로세스에서 실행되는데 프로세스란 어떠한 프로그램이 메모리에 저장되고 실행되는 인스턴스이다. 쉽게 말해, 프로세스 안에서 쓰레드가 일을 처리하는 것이다. 이 때, 많은 Task를 동시적으로 처리하기 위해서는 쓰레드가 많이 필요하다. 이러한 단점을 보완하는 것이 코루틴이다.

 

코루틴과 쓰레드의 차이

 코루틴은 단일 쓰레드에서 Task를 쪼개 Object 형식으로 처리한다. 그렇기 때문에 각각의 Object의 우선순위를 정해 하나의 Task를 보다 효율적으로 처리할 수 있게 되는 것이다.(쓰레드라면 하나의 Task가 실행되었을 때 작업을 모두 처리 할 때 까지 다른 작업을  할 수 없다.) 쓰레드도 여러개의 쓰레드에서 여러개의 Task를 동시적으로 처리할 수 있지만 하나의 쓰레드는 한가지 Task밖에 처리하지 못한다. 이것을 비동기적 작동이라고 하며, 코루틴은 하나의 쓰레드에서 여러개의 Task를 처리한다는 점에서 동기적 작동이라고 한다. 이것이 코루틴과 쓰레드의 가장 큰 차이점이다.

 

Unity에서의 코루틴

 Unity에서는 Update 메서드내의 코드를 매 프레임마다 반복 연산 하며 그것을 시각화하여 게임이 진행되도록 만든다. 그렇기 때문에 프레임을 제한해야하는 기능을 구현하는 것에 한계가 있으며 연상 방식도 비효율 적이다. 그러나 코루틴을 사용하면 프레임의 흐름을 메서드를 활용하듯이 제어가 가능하며 더 효율적인 연산이 가능하다. 특히 다른 코루틴, 메서드와 연결하여 더욱 유기적인 프로그래밍이 가능하다는 점에서 큰 강점이 있다.

 

 

Unity에서 코루틴의 구현

namespace Coroutine
{
    class Program
    {
        Coroutine coroutine; // 코루틴을 변수에 저장하여 사용 할 수 있다.

        public void Start()
        {
            this.coroutine = StartCoroutine(Coroutine()); //코루틴 호출
        }

        IEnumerator Coroutine() //코루틴 정의
        {
            while (true) //Update 메서드처럼 프레임마다 반복시킬 수 있다.
            {
                yield return null; //한 프레임이 지나도록 기능한다.
            }            
        }
    }
}

 

 

'C# > 수업 과제' 카테고리의 다른 글

Unity) 유니티 Button.onClick.AddListener 람다식 주의점  (0) 2023.02.07
오브젝트 풀링  (0) 2023.02.05
그래프를 통한 BFS 연습  (0) 2023.01.30
그래프  (0) 2023.01.27
이진 탐색 알고리즘이란  (0) 2023.01.26

+ Recent posts