개발 관련 내용은 우측 링크를 참고 해주세요.
Snake Readme
일부 인원만 접근 가능 합니다.


lock등으로 데이터의 Sync 에 신경써야 할 경우가 많다.간단히 이야기 하자면, 동기는 후임에게 일 시켜놓고 감시했다 일 끝나면 내가 다른 일을 하는 것이고, 비동기는 후임에게 일 시켜놓고 알아서 난 다른일 하다가 후임이 일 끝났다 보고 하면 보고 받는 느낌이라 보면 된다. (후임자동화)
보통 다중처리, 즉 동시에 여러 작업을 처리하는 경우(병렬 처리 라고도 한다.) Multithread 를 사용하는 경우가 많다. 그럼 Thread 와 Async 는 서로 다른 것인가? 비슷한 동작을 하는데?
결론부터 이야기 하자면 그렇기도 하고 아니기도 한다.
C# 에서의 Async 의 경우 Task 로 구현/관리를 하는 경우가 많아 이를 갖고 비교를 해 보자면,
| 분류 | Thread | Task |
|---|---|---|
| 정의 | OS의 최소 실행 단위 | 비동기 작업을 위한 추상화 클래스 |
| 효율성 | 직접 제어 | ThreadPool사용, 효율적인 스레딩 |
| 사용성 | 생성, 시작, 중지 등의 직접 관리 필요 | 세부 작업 내부 처리, 로직에 집중 |
| 코드 복잡성 | 동기화 문제, 데드락 등 해결 필요 | 문제를 보다 쉽게 풀 수 있음 |
| 반환값 | 작업 결과 직접 반환 불가 (보통 Data Channel 활용) | Task 형태로 반환 가능 |
| 비동기 지원 | 직접 지원 불가 | async await 문법 지원 |
출처 링크: C# 비동기 프로그래밍 : Thread와 Task의 차이점
비동기 프로그램의 실행 및 관리를 위해 결국은 Thread 를 Wrapping 해서 구현 되어있다. 즉 실행 단위는 파고 들면 Thread 나 마찬가지 😀
최근 경험으로는 주로 Web 계열에서 많이 사용하고 있다.
public static Task<int> ReadTask(this Stream stream, byte[] buffer, int offset, int count, object state)
{
var tcs = new TaskCompletionSource<int>();
stream.BeginRead(buffer, offset, count, ar =>
{
try { tcs.SetResult(stream.EndRead(ar)); }
catch (Exception exc) { tcs.SetException(exc); }
}, state);
return tcs.Task;
}
위 코드 예제처럼 Task 는 Return 을 받을 수 있다.
이번 개발에 가장 중점 요인은 "뱀이 움직이는 것과 동시에 키보드 입력을 받아야 하는 것"이라 볼 수 있다.
뭔가 동시에 진행해야겠다는 생각에 Async 에 대해 검색하였지만, 실제로 구현된 것은 정확하게는 Async가 아니다. 그냥 Task로 만든 Sync를 그럴싸하게 동시 입력 처럼 보이게 만들었을 뿐이다. 제대로 동시에 진행하게 하려면 어떻게 해야 하는지 아직 감이 잘 오지 않는다.
Unity 에서는 이러한 부분에 대해 Framework(혹은 엔진?)에서 다뤄 주는 것으로 보이긴 했다만, 과거 잠깐 담궈봤던 코드 내용으로는 직접 구현한 코드에 한해서는 Async던 Multithread던 처리를 해야 했던 것으로 기억한다. 물론 이것은 GPT가 이야기 해준 것이기 때문에 실무와는 다른 방향성일 수도 있을 것 같다.
되도록 배운 것을 최대한 활용해서 진행해본 내용이다.
일단, Async를 해보겠다고 덤벼본 것이 가장 크다. 굳이 그럴 필요가 없었을 지도 모르는데.
코드상 Console.KeyAvailable이라는 녀석을 사용하였다. 간단히, Console 에 입력된 Key 시그널의 버퍼내 데이터 유무 체크다. 뭔가 데이터가 있으면 true를 없으면 false를 뱉는다.
즉, 저 Property를 사용하면 딱히 Blocking 될 이유가 없다. 참고로, Console.ReadKey().key 이 녀석이 Blocking을 유발하는 녀석이다. 이거 때문에 자꾸 Loop문이 멈춰 돌아가시는줄 알았다고생했다.
플레이어의 늘어난 몸체를 옮기는 코드로 생각된다. 처음에는 이걸 어떻게 구현하면 좋을까 막막했지만, 그림을 그려가며 진행하니 생각보다 사고가 자연스럽게 흘렀다.

플레이어가 이동할 때 맨 앞(head)은 앞으로 가야할 Position을 체워 넣고, 그 후 Body는 하나씩 미뤄 놓는 방식으로 하였다.
연산이 좀 많아지긴 하지만, 솔직히 딱히 더 생각 나는 부분이 없긴 하다 ㅠㅠ
(참고로, Position은 이해를 돕기 위해 배열로 적었으며 실제 구현은 List로 되어 있다.)