본문 바로가기
C#/C# 학습 (TIL)

C# 중급문법 Day8 Coroutine (코루틴)

by jjiing 2022. 6. 23.

Coroutine?

Co + routine : 협력하는 루틴

 

 

 

StartCoroutine과 StopCoroutine에 관한 3가지 방식

(StopCoroutine이 작동을 안하는 이유)

 

이와 같은 코루틴이 있을 때

이를 start시키고 stop시키는 3가지 방식의 차이에 대해 살펴본다.

 

StartCoroutine

   

StopCoroutine

<2> 처럼 그냥 코루틴 자체 함수를 매개변수로 넣어주게 되면

StopCoroutine을 했을 때 해당 코루틴을 찾지 못해 StopCoroutine이 작동하지 않는다.

 

이 경우 <1> 과 같이 미리 timeCo에 인스턴스를 빼서 넣어줘서

StopCoroutine이 확실하게 어떤 코루틴을 stop시켜야하는지 알 수 있게 해주면 해결된다.

 

또는 <3> 처럼 string methodName을 통해 처리하면

런타임에 리플렉션으로 코루틴을 찾아 처리해주는데,

DelayTimeCo를 한 개만 돌리고 있다면 stopCoroutine이 적절히 작동하지만, 여러개가 작동하고 있다면 우리가 원하는 코루틴을 멈출 수 없게 될 수도 있다.

 

따라서 <1>처럼 사용해주는게 가장 적절하다.

 

 

 

 

 

 

 

Ienumerator의 이해 - 반복자 패턴

 

 

반복자 패턴

Enumerator는 이런 구조로 작동하는데

enumerable은 정해진 순서대로 반복할 수 있는 놈이고, Enumerator라는 정해진 순서로 돌릴 수 있는 도구를 가지고 있다.

저게 stack이면 stack의 순서대로 빼주는 것이고, queue 면 queue의 순서대로 빼주는 것이다.

이러한 패턴을 반복자 패턴이라고 한다.

 

그리고 우리가 저 enumerable을 상속받아 우리가 실제로 쓰는 것이다.

 

그 예시로 stack을 확인해보면 IEnuerable을 상속받고 있다.

 

 

 

캡슐화

foreach는 IEnumerable을 상속받은 intList를 가져다 쓰고 
또 그 안에서 GetEnumerator를 통해 IEnumerator를 상속받은 놈을 사용하지만
foreach(기능을 사용하는 놈)가 알아야하는 건 안에 구현된 내용이 아니라,
사용할 수 있는 형태만 알면 된다.
이렇게 내부의 기능의 구현을 숨기면서 사용자에게 인터페이스(사용할 수 있는 기능)만을 제공해주는 것을 캡슐화라고 한다.

 

IEnumerable - IEnumerator라는 도구를 가지고 있다.
IEnumerator

 

 

따라서 Coroutine에 있는 Inumerator가 뜻하는 것은 순서를 뜻하는 것이다.

 

CustomYieldSpaceBar의 MoveNext가 false가 되면 그 다음으로 넘어감
커스텀한 클래스 - 스페이스를 누르면 false를 리턴

 

 

 

<정리>

Enumerable : 정해진 순서대로 반복시킬 수 있는 도구(Enumerator)를 가지고 있어서 정해진 순서대로 반복시킬 수 있는 것
Enumerator : 정해진 순서대로 반복시키는 도구