🤢 저 혼자 찾아보고 생각한 내용을 담아놓은 글이라 틀린 내용이 많을 수 있습니다.
유니티로 게임을 만들다보면 많이 쓰는 것 중에 하나가 코루틴이다.
처음 공부 시작했을 때는 이름도 이상한거 같고 많이 안 쓸 것 같아서 그냥 넘어갔던 기억이 있다.
아무튼 혼자 가만히 있다가 문득 누군가 나한테 코루틴이 뭐냐고 물으면 설명을 할 수가 없을 것 같다는 생각이 들었다.
그래서 인터넷 자료들을 찾아가며 혼자 정리 해봤다.
코루틴을 정리 하기 전에 3 가지를 먼저 정리하고 가야겠다.
닷넷 프레임워크(.NET Framework) 란?
닷넷은 마이크로소프트사에서 제공하는 윈도우 프로그램 개발 및 실행환경이다.
유니티에서 사용하는 C#은 .NET을 위해 만들어졌다고 한다.
닷넷으로 개발을 한다는 말은 닷넷 프레임워크를 사용해 개발을 한다는 의미이다.
가끔 프로그램을 깔다보면 .net framework를 설치 하라는 것을 본적이 있을것이다.
현재 세상에는 많은 운영체제들이 존재하는데(윈도우,맥,유닉스,안드로이드 등등),
이 운영체제 안에서 프로그램을 돌리려면 특정 플랫폼 전용의 네이티브 코드로 만들어야 한다.
✔네이티브코드 : 컴퓨터의 CPU와 운영체제가 이해할 수 있는 코드
프로그램을 여러 플랫폼에서 돌아가게 하려면 매번 해당 플랫폼에 맞는 네이티브 코드로 프로그램을 만들어야 하는데,
닷넷 프레임워크로 소프트웨어를 만든다면, 어느 플랫폼에서나 실행이 가능한 프로그램을 만들 수 있다고 한다.
즉 닷넷 프레임워크가 컴퓨터에 설치가 되어 있다면, 어떤 운영체제에서도 닷넷으로 만든 소프트웨어가 작동을 한다고 한다.
출처 (스크랩) 닷넷 프레임워크와 C#이 뭔가... : 네이버 블로그 (naver.com)
프로세스(Process)란?
프로세스(process)란 단순히 실행 중인 프로그램(program)이라고 할 수 있습니다.
즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다.
이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.
스레드(thread)란?
스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미합니다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.
그래서 코루틴은?
다시 코루틴으로 돌아와서 ..
유니티는 닷넷을 사용하고 있는데, 닷넷은 멀티쓰레드를 지원하지만 유니티는 단일 쓰레드로 동작을 한다고 한다.
멀티쓰레드를 가지는 코드를 작성하면 버그 발생률이 높아지고 신경써야 할 부분이 많다고 한다.
게임 오브젝트들은 상호 작용으로 표현 되어야 할 수 밖에 없기 때문에 동시성이 중요하며
이 동시성을 표현하기 위해 코루틴을 쓴다.
그래서 유니티에서 코루틴을 사용함으로써 멀티 쓰레드를 흉내낼 수 있다고 하는데,
쓰레드라는 개념이 아직 잘 잡히지 않아서 이론적으로는 무슨말인지 잘 모르겠다.
메인 루틴, 서브 루틴, 그리고 코루틴
C나 C++ 를 보면 실행했을때 동작하는 main이라는 메인 함수가 있다.
다른 곳에 함수를 만들어봤자 그 함수는 작동 되지 않고 이 main()이라는 함수에 넣어 줘야 작동이 된다.
즉, main함수는 메인으로 작동하는 메인 루틴이고 그 안에서 작동하는 하나하나의 함수들은 서브 루틴이다.
유니티로 생각하면 Update함수 안에서 돌아가는 함수들을 생각하면 될 것 같다.
서브 루틴은 코드가 끝까지 실행 되거나 return을 만나면 호출됐던 곳으로 돌아가 메인 루틴안의 다른 코드가 실행 된다.
그리고 co-루틴
함께하는 루틴이라고 생각하면 이해가 조금 되는 것 같다.
서브루틴은 메인루틴의 하위 개념이 강한데, 코루틴은 메인루틴과 동등한 위치라고 한다.
코루틴은 return 대신에 yield return을 무조건 적어 줘야 한다.
yield는 양보라는 뜻인데 , 코루틴안의 코드들이 실행되다가 yield return을 만나면 일시정지하고 유니티에게 제어권을 넘겨준다.
그리고 yield return에 적어놓은 코드의 실행이 끝난 후에 다시 일시정지 한 곳 부터 실행된다.
한 쓰레드를 양보해가면서 사용한다는게 맞는 표현일까 모르겠다.
코루틴의 사용
나는 내가 만든 함수 안에서 잠깐이라도 계속 실행이 되어야 하는 코드가 있을때나
시간을 지연 시켜야 할 때 많이 사용했는데
이해하기에 괜찮은 방법이 있어서 이 방식으로 한번 써보려고 한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Update()
{
//Space를 누르면 작동
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(countCo());
countCommon();
}
}
// 0부터 4까지 증가하는 일반 함수
void countCommon()
{
for (int i = 0; i < 5; i++)
{
Debug.Log("일반 함수: " + i);
}
}
// 0부터 4까지 증가하는 코루틴
IEnumerator countCo()
{
for (int i = 0; i < 5; i++)
{
Debug.Log("코루틴: " + i);
yield return null;
}
}
}
일반함수, 코루틴에 각각 0부터 4까지 증가하며 로그를 찍게 만들었다.
프레임마다 호출하는 Update 함수안에 스페이스 버튼을 누르면 코루틴->일반함수 순으로 실행 되게 했다.
결과는..
null을 yield return 하면 1프레임 양보를 한다는 뜻인데,
코루틴 안의 for문에서 0을 찍고나서 한 프레임 양보를 했을때 일반 함수는 for문을 한번에 다 찍어낸걸 볼 수 있다.
그리고 그 이후에 코루틴으로 돌아가 나머지 for문이 실행된 것을 볼 수있다.
네트워크 접속을 기다릴때 코루틴을 사용하고 yield return을 쓰는 것을 많이 보았는데
아마 네트워크에 접속이 될 때 까지 양보를 하고 다음 코드를 실행 하겠다는 뜻 같다.
yield return의 종류에 대해 알고 싶은 분들은 베르님의 유튜브를 추천드린다.
궁금해서 시간을 조금 할애해서 정리 해봤는데..
아직도 한줄로 코루틴이 뭐냐고 설명 해보라고 한다면 못할것 같다.
코루틴에 대해 공부 하고 싶다면 전문성 있고 잘 정리되어 있는 밑의 블로그 글들을 추천드린다.
유니티 코루틴(Coroutine)과 서브 루틴 : 네이버 블로그 (naver.com)
코루틴의 이해 - Teddy Games (tistory.com)
코루틴(Coroutine) 이해하기 – Kwang Yul Seo
[유니티 기초] - Coroutine : 네이버 블로그 (naver.com)
유니티 공식 문서 코루틴 - Unity 매뉴얼 (unity3d.com)
코루틴 때문에 닷넷 알아보다가 재밌어 보이는 것을 발견해서 다음엔 그걸 정리 해볼까 한다.
코루틴에 대한 고찰 끝
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[Unity_C#] Switch문 & Switch 식 (0) | 2022.08.21 |
---|---|
클래스와 구조체 / 배열과 리스트 / awake와 start의 차이 (0) | 2022.08.11 |
가비지 컬렉터(garbage collector) (0) | 2022.08.08 |
Object 형식과 박싱 & 언박싱 (0) | 2022.08.08 |
[OOP]객체 지향 프로그래밍에 대해 (0) | 2022.07.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!