참고 사이트 : https://wonsang98.tistory.com/220
Invoke는 지정 시간 이후 함수를 실행하거나, 반복 실행할 때 사용하는 기능이다.
사용법이 간단하다.
함수 이름과 시간을 받아서 실행한다.
반복 실행 및 취소도 메서드 호출로만 가능하다.
GameObject가 비활성화되어도 Invoke 함수는 계속 실행된다.(오브젝트 파괴 시 종료된다.)
매개변수 전달이 불가능하다.
문자열로 함수명을 넘기기 때문에 오타 방지가 어렵다.
내부적으로 Reflection을 사용한다.(코루틴보다 느릴 수 있다.)
복잡한 조건과 로직처리가 어렵다.
Coroutine은 메서드 실행을 한 번에 끝내지 않고, 중간에 양보(yield)하고 다시 재개할 수 있는 Unity의 기능이다.
멀티스레드는 아니지만, 여러 작업이 동시에 처리되는 것처럼 비동기적인 구조를 만든다.
코루틴은 IEnumerator를 반환하는 메서드에서만 사용 가능하다.
일정 시간 지연, 특정 조건까지 대기, 프레임 단위로 작업 분할 등 시간 제어가 매우 편리하다.
매개변수를 넘겨서 유연하게 사용 가능하다.
실행 중단, 종료, 재시작이 자유롭다.
GameObject가 비활성화 될 경우, 코루틴은 자동으로 정지된다.
코루틴으로 시작 시, yield로 객체를 만들 때 GC 오버헤드가 발생한다.
너무 많은 코루틴을 동시에 실행하면 관리가 어려울 수 있다.
| 구분 | Coroutine(코루틴) | Invoke(인보크) |
|---|---|---|
| 실행 방식 | IEnumerator + yield(양보/재개) | 함수명(String), Reflection 사용 |
| 지연 실행/반복 | O | O |
| 매개변수 전달 | O | X |
| 유연성 | 복잡한 조건, 흐름 제어에 유리하다. | 단순 지연, 반복에 적합하다. |
| GameObject 비활성 | 즉시 정지한다. | 계속 실행된다. |
| TimeScale 0 적용 | WaitForSecondsRealtime으로 무시 가능 | 불가능 (TimeScale의 영향 받음) |
| 종료 방법 | StopCoroutine, 조건문 활용 | CancelInvoke, 오브젝트 파괴 |
| 성능 | 상대적으로 빠름, 가비지가 있다 | 느릴 수 있다(Reflection 때문) |
| 코드 간결함 | 상대적으로 복잡하다 | 아주 간단하다. |