C#의 Console.KeyAvailable 속성은 콘솔 입력 스트림에 키 입력이 대기 중인지 여부를 나타내는 값을 가져오는 데 사용됩니다. 이 속성은 ReadKey()처럼 프로그램 실행을 멈추고 기다리지 않고, 키 입력이 있는지만 즉시 확인할 수 있어서 게임 루프나 백그라운드 작업 중 키 입력을 감지해야 하는 상황에서 특히 유용합니다.
구문
Console.KeyAvailable 속성의 구문은 다음과 같습니다.
public static bool KeyAvailable { get; }KeyAvailable은 정적(static) 읽기 전용 속성으로, 별도의 매개변수 없이 bool 타입의 값을 반환합니다. 입력 스트림에 키 입력이 있으면 true, 없으면 false를 반환합니다.
주요 특징
- 키 입력 여부만 확인하며, 실제로 키를 소비(consume)하지 않습니다.
- 콘솔 창이 아닌 환경에서 호출하면
InvalidOperationException이 발생할 수 있습니다. - 일반적으로
Thread.Sleep()과 함께 사용하여 CPU 점유율을 낮추면서 키 입력을 폴링(polling)합니다.
예제 1
다음은 C#에서 Console.KeyAvailable 속성을 구현하는 예제입니다.
using System;
using System.Threading;
class Demo {
public static void Main(string[] args) {
ConsoleKeyInfo cs = new ConsoleKeyInfo();
do {
Console.WriteLine("\n키를 누르면 화면에 표시됩니다. 종료하려면 'Q' 키를 누르세요.");
while (Console.KeyAvailable == false)
Thread.Sleep(100);
cs = Console.ReadKey(true);
Console.WriteLine("누른 키: '{0}'", cs.Key);
}
while (cs.Key != ConsoleKey.Q);
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

이 예제에서는 while (Console.KeyAvailable == false) 조건문으로 키 입력이 들어올 때까지 100밀리초 간격으로 대기합니다. 키가 입력되면 ReadKey(true)로 해당 키를 읽어 화면에 출력하고, 'Q' 키가 입력될 때까지 반복합니다.
예제 2
이번에는 대기 시간을 200밀리초로 늘리고, 종료 키를 'P'로 변경한 예제입니다.
using System;
using System.Threading;
class Demo {
public static void Main(string[] args) {
ConsoleKeyInfo cs = new ConsoleKeyInfo();
do {
Console.WriteLine("\n키를 누르면 화면에 표시됩니다. 종료하려면 'P' 키를 누르세요.");
while (Console.KeyAvailable == false)
Thread.Sleep(200);
cs = Console.ReadKey(true);
Console.WriteLine("누른 키: '{0}'", cs.Key);
}
while (cs.Key != ConsoleKey.P);
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

정리
Console.KeyAvailable 속성은 콘솔 애플리케이션에서 키 입력을 논블로킹(non-blocking) 방식으로 감지할 수 있는 간편한 방법을 제공합니다. Thread.Sleep()과 함께 사용하면 불필요한 CPU 자원 낭비를 줄이면서 사용자 입력에 즉각적으로 반응하는 프로그램을 만들 수 있습니다.