키보드 눌렀는지 비동기 방식으로 검사하기

@codemaru · January 03, 2012 · 2 min read

프로그래밍을 하다보면 동기/비동기라는 말이 자주 등장합니다. 동기 방식이란 해당 I/O 작업이 완료될 때까지 프로그램이 블록된다는 것을 의미합니다. 소켓 통신에서 수신을 한다면 데이터가 올 때까지 프로그램이 정지한다는 말이죠. 키보드 입력을 받는다면 사용자가 키보드에서 데이터를 입력할 때까지 프로그램이 정지하는 겁니다. 그렇다면 비동기는 어떻게 동작하는 것일까요? 동기 방식과 정반대로 동작하는 것을 말합니다. I/O가 완료되지 않아도 바로 리턴하며, I/O가 완료됐을 때 이벤트를 받는 형태로 동작하는 방식입니다. 따라서 프로그램은 계속 다른 작업을 할 수 있다는 장점이 있습니다.

… 작성 중 (나용 추가 필요) …

아래 프로그램은 지속적으로 “Happy New Year!!!”을 출력하다가 사용자가 q를 누르면 종료하는 프로그램입니다. _kbhit 함수는 사용자가 키보드를 입력했는지 하지 않았는지를 검사하는 함수 입니다. 키보드를 입력했으면 0이 아닌 값을, 입력하지 않았다면 0을 리턴하죠. getch는 키보드 입력 버퍼에서 한 글자를 입력 받아서 해당 키 값을 리턴해 주는 함수입니다.

#include <stdio.h>
#include <tchar.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	for(;;)
	{
		if(_kbhit() && getch() == 'q')
			break;

		printf("Happy New Year!!!\n");
	}

	return 0;
}

아래 프로그램과 동작을 비교해 보시면 어떤 차이가 있는지 금방 알 수 있습니다.

#include <stdio.h>
#include <tchar.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	for(;;)
	{
		if(getch() == 'q')
			break;

		printf("Happy New Year!!!\n");
	}

	return 0;
}
@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중