top of page

코루틴 vs 인보크

  • 작성자 사진: 100 powerun
    100 powerun
  • 5월 29일
  • 3분 분량

최종 수정일: 5월 30일

오늘은 코딩하다 찾은 코루틴과 인보크에 대해 한번 알아보고 비교해보고자 한다.



코루틴(Coroutine)

"시간이 걸리는 작업을 한 번에 다 하지 않고, 나눠서 여러 프레임에 걸쳐 조금씩 처리하는 방법" 이라고 보면 돼.

-GPT-

즉, 어떠한 동작의 사이에 대기, 또는 지연을 넣어 한꺼번에 가 아닌 일정 간격으로 순차적으로 처리하는 방법이라고 보면 된다


아래의 예시를 봐보자

void Start()

    {
        StartCoroutine(DoSomething());
    }

    IEnumerator DoSomething()
    {
        Debug.Log("a - 바로 시작");
        yield return new WaitForSeconds(3f);
        Debug.Log("b - a 이후 3초 뒤 실행");
    }

아래가 가장 대표적인 코루틴의 사용 예시이다.


로그를 바로 찍은 뒤 yield return new WaitForSeconds(3f);를 이용해 3초의 지연을 발생 시킨 뒤 다른 로그를 출력해주는 동작이다. 즉 이렇게 하나의 함수나, 동작이 한꺼번에 나오는 것이 아닌 조금 지연된 상태로 나오게 해주는 것이다.


이런 동작은 "a동작 이후 n초 뒤에 b동작 실행"같은 기능을 만들 때에 사용 된다



주의!

특이한 점이라면 반드시 yield return을 중간에 써줘야 한다

yield return의 종류를 알고싶다면 아래를 한번 펼쳐보자


코루틴의 yield 종류 확인해보기

1. yield return new WaitForSeconds(n);

"n초 만큼 기다려라"


코루틴 하면 가장 많이 사용한 방법으로 n초만큼 지연을 발생시킨다.

가장 쉬우면서 가장 조절이 편한 방법이다.




2. yield return new WaitForSecondsRealtime(n)

"진짜 시간 기준으로 x초 기다려라"


진짜 시간 기준이라 하면 이해하기 힘들수도 있지만 WaitForSeconds와의 가장 큰 차별점이라면 WaitForSecondsRealtime는 Time.timeScale의 영향을 받지 못한다. 즉 timeScale의 영향을 받지 말아야 하는 요소에서 유용하게 쓰일 수 있다.




yield return null;

"한 프레임만 기다려라"


이 방법은 한 프레임만 쉬는 지연으로 보통 게임 동작 보다는 애니메이션에 많이 사용된다고 한다.

사실 많이 안써보기도 해서 자세하게 적을 수 없는게 안타까울 뿐이다.




3. yield return StartCoroutine(다른코루틴());

"다른 코루틴이 끝날 때 까지 기다려라"


그 말대로 다른 코루틴이 종료된 후에 작동하도록 만드는 지연으로 순차 동작이나, "다음에 이러한 동작이 나와야 한다." 라는 기능으로 설계된 동작을 만들 때 유용하다.




4. yield break;

"얼음!!!!"


이름에서도 유추 가능하다시피 코루틴을 강제로 멈추는 동작이다. 내부의 조건문을 이용해 "a조건이 거짓이면 코루틴을 멈춰라" 같은 동작을 만들 수 있다.




5. yield return new WaitUntil(() => 조건)
6. yield return new WaitWhile(() => 조건)

"조건이 참/거짓이 될 때 까지 기다려라"


말 그대로 위의 5번인 WaitUntil은 조건이 참이 될 때 까지, 6번인 WaitWhile은 조건이 거짓이 될 때 까지 기대리는 방식이다.



인보크(Invoke)

"특정 함수(Function)를 일정 시간 후에 한 번 실행해줘!" 이게 바로 Invoke야.

-GPT-

설명을 보니 뭔가 묘하다. 코루틴과 똑같이 지연을 해주는 역할을 수행하는걸 알 수 있는데 예시를 먼저 봐보자


void Start()
{
    Invoke("SayHello", 2f);
}

void SayHello()
{
    Debug.Log("Hello, world!");
}

위의 예시를 보면 SayHello()라는 함수를 2초 뒤에 실행시키는 동작을 수행하게 된다.



인보크의 다른 유형이라면 InvokeRepeating이 있으며 인보크 리피팅은 지연하고자 하는 함수를 지연 시간 간격으로 반복 실행 시켜준다.


아래의 예시를 봐보자.

void Start()
{
    InvokeRepeating("SayHello", 2f, 4f);
}

void SayHello()
{
    Debug.Log("Hello, world!");
}

위의 인보크와는 달리 사용이 좀더 긴데 아주 쉽게 설명하자면

InvokeRepeating("사용할 함수 이름을 문자열로", 첫 지연 시간, 첫 지연 후 지연 간격);

이렇게 사용할 수 있다. 만일 첫 지연 후 지연 간격을 입력하지 않고 아래처럼 적는다면

InvokeRepeating("사용할 함수 이름을 문자열로", 지연 시간);

이렇게 된다.



둘이 같은 동작, 그럼 뭘 쓸까?

우선 둘의 동작은 같으나 사용처는 분명히 다른 것이 특징이다.


가장 크게 눈에 띄는 공통점이라면 "지연 후 실행"이 기능이 제일 대표적이다.

하지만 코루틴은 인보크보다 더욱 많은 기능을 수행할 수 있는데,

위는 GPT에게 물어본 결과이다.

GPT는 확실하지 않으니 인터넷을 조금 더 찾아본 결과 해당 내용이 이해한 바로는 어느정도는 맞다는걸 알 수 있었다.


인보크는 그저 지연 기능 뿐만인 반면에 코루틴은 반복 실행, 조건 기다리기, 중간에 멈추기, 코루틴 내부에 여러 조건을 이용해 다른 동작을 만드는 유연한 흐름제어, 그 다음 매개변수를 받아올 수 있는 파라미터 전달까지, 인보크가 수행할 수 없는 수많은 기능들을 제공한다.



"에이. 그럼 인보크 쓸 필요는 없네 뭐"


라고 생각이 들 수 있는데, 인보크는 동작이 미칠 정도로 단순하다는 장점이 있다.

사용하기도 편하고 단순하며 시간 지연 후 동작이라는 단순한 동작 때문에 사용하기 쉽다는 장점이 있다. 무엇보다 코루틴처럼 유니티가 무한 반복을 일으키는 사고를 일으킬 수 있는 위험성이 있는 반면(예시: while문을 만들어 놓고 빠져나가지 못하게 만들어 놓음)인보크는 이러한 위험성이 적다.


그렇다고 또 인보크만 사용하는것이 괜찮은가 싶다면 그건 또 아니다.

코루틴을 사용하는 가장 결정적 이유는 인보크가 코루틴처럼 유연하지 못하다는 단점이 있기 때문이다. 위에서 설명한 대로 아주 간단한 동작을 수행하고 반복이라 해봤자 인보크 리피팅(InvokeRepeating)이지만, 이 또한 n초 간격으로의 반복 동작밖에 존재하지 않는다. 이러한 이유로 유연한 동작을 원한다면 코루틴을 사용해야 한다.


최적화에서는 어떤게 좋은가 하면은 보통은 인보크가 더 우세하다 하는데, 기본 동작만 놓고 본다면 둘의 차이는 있을지언정 사람이 인지할 수 있을 정도의 속도 차이는 보이지 않기 때문에 크게 신경쓰지 않아도 좋다.



무튼 마무리로, 덕트 테이프가 아무리 만능이라지만, 움직임이 많은 로봇의 구동부가 떨어져 나갔다고 덕트 테이프를 사용하면 안되는 것 처럼 뭐든 지 간에 적재적소에 사용하는것이 최고이다.

간단한 동작에는 인보크를, 유연하며 복잡한 동작에는 코루틴을 사용하여 멋진 실행 동작들을 한번 만들어 보자.


최근 게시물

전체 보기
25.05.07

유니티 프로젝트를 진행하며 생긴 자잘한 문제들과 해결을 정리하였습니다. 처참한 TIL작성율 작업량이 길어짐에 따라 TIL의 작성률이 바닥을 길 정도로 떨어졌습니다. 프로젝트 제작이 중심이 되다보니 TIL이 우선순위에서 밀려나 작성을 못하는 날짜가...

 
 
 

Comments


bottom of page