사용자로부터 데이터 요청하기 - Spectre 콘솔 시리즈
C# 콘솔 애플리케이션은 프로그램이 사용자로부터 입력을 읽고 출력을 표시하는 방식을 배우는 가장 간단한 방법이었습니다. 팀 코리는 자신의 Spectre.Console 시리즈에서 단순한 흑백 명령 프롬프트를 훨씬 뛰어넘는 방법을 보여줍니다. 이 글에서는 그의 비디오 " 사용자로부터 데이터 요청 - 스펙터 콘솔 시리즈 "를 자세히 살펴보고, 그가 어떻게 입력을 수집하고, 숫자 값을 처리하고, 오류를 검사하고, 프로그램을 더욱 사용자 친화적으로 만드는지, 그리고 이 모든 과정을 상용구 코드를 수동으로 수정하지 않고 어떻게 구현하는지 알아보겠습니다. 영상의 원하는 부분으로 바로 이동할 수 있도록 타임스탬프가 포함되어 있습니다.
소개: 명령줄 입력을 더 쉽게 사용하는 방법
팀은 맨 처음에 Spectre.Console이 일반적인 C 명령줄 입력을 시각적으로 보기 좋은 것으로 변환할 수 있다는 점을 상기시켜 줍니다. 완전한 정적 void Main(string[] args) 메서드를 작성하고 Console.ReadLine()을 사용하여 표준 입력 스트림에서 수동으로 읽고 구문 분석하고 예외를 처리하는 대신 Spectre.Console은 이러한 작업을 자동으로 처리해 줍니다.
Tim의 말(0:17)에 따르면, 이 세션에서는 "사용자로부터 입력을 요청하고, 데이터를 검증하고, 적절한 데이터 유형으로 변환하는 방법"을 보여줄 것입니다. 이는 콘솔이나 명령 프롬프트를 사용하는 모든 개발자에게 필수적인 기술입니다.
Ask로 정수 값 읽기
Tim이 제시하는 첫 번째 예시(0:35)는 우리에게 친숙한 것입니다. 바로 사용자에게 나이를 묻는 것입니다. 전통적으로 C#에서는 다음과 같이 작성합니다.
static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}static void Main(string[] args)
{
Console.Write("Enter integer age: ");
string input = Console.ReadLine();
int age = int.Parse(input);
}이 예시는 C# 프로그램의 전형적인 진입점인 main 함수와 콘솔을 통해 키보드로부터 입력 매개변수를 받는 방법을 보여줍니다. 문자열 입력값을 정수형 age로 변환하려면 int.Parse 또는 Convert.ToInt32를 사용해야 합니다. Tim은 잘못된 입력을 처리하고 예외를 직접 발생시키거나 처리해야 한다고 지적합니다.
Spectre.Console을 사용하면 그는 간단히 다음과 같이 작성합니다.
int age = AnsiConsole.Ask<int>("What is your age?");int age = AnsiConsole.Ask<int>("What is your age?");이 한 줄짜리 코드는 입력을 읽어 정수 값으로 변환하고, 사용자가 숫자 이외의 문자를 입력하면 빨간색 오류 메시지를 표시합니다. 별도의 오류 검사 코드는 필요하지 않습니다. 사용자가 Enter 키를 누르면 해당 메서드는 입력을 읽고 숫자형으로 파싱한 후 age 변수에 저장합니다.
불리언 입력과 프롬프트 방식이 더 나은 이유
다음으로 (1:14) Tim은 불리언 값을 요청하는 방법을 보여줍니다.
bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");bool isHappy = AnsiConsole.Ask<bool>("Are you happy?");사용자가 "참" 또는 "거짓"을 입력하면 정상적으로 작동합니다. 하지만 사용자가 "예"라고 입력하면 Spectre.Console은 빨간색 오류 메시지를 표시합니다. 이는 Ask가

여기서 Tim은 보다 유연한 API인 Prompt로 전환하는데, Prompt는 사용자가 직접 정의할 수 있는 미니 클래스처럼 동작합니다.
선택지를 위한 TextPrompt 사용
3시 2분에 Tim은 질문하기에서 텍스트 프롬프트를 사용하여 프롬프트하기 모드로 전환합니다.
var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));var happyText = AnsiConsole.Prompt(
new TextPrompt<string>("Are you happy?")
.AddChoice("Yes")
.AddChoice("No"));프로그램이 실행될 때(4:48), 콘솔에는 질문 뒤에 [예/아니오]가 표시됩니다. 이는 Spectre.Console이 명령줄을 꾸며 사용자가 허용 가능한 답변을 쉽게 확인할 수 있도록 하는 기능입니다. 다른 내용을 입력하면 해당 메서드는 입력된 내용을 목록과 비교하여 사용 가능한 옵션을 선택하도록 안내하는 친절한 메시지를 표시합니다.

기본값 추가
Tim은 이어서 기본값을 추가합니다(5:16):
.DefaultValue("Yes").DefaultValue("Yes")이제 프로그램이 실행될 때 사용자는 텍스트가 없는 줄 바꿈(Enter 키)만 누르면 메서드가 자동으로 변수에 "Yes"를 할당합니다. 메인 메서드에 추가 코드를 넣지 않고 적절한 기본값을 저장하고 싶을 때 매우 유용합니다.
정수 입력 요청 및 유효성 검사
6시 1분에 Tim은 정수 입력을 사용한 더 풍부한 예제를 보여줍니다. 그는 새로운 TextPrompt를 사용하여 나이를 다시 묻지만, 프롬프트 안에 유효성 검사 로직을 추가합니다.
int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));int age = AnsiConsole.Prompt(
new TextPrompt<int>("What is your age?")
.Validate(x =>
{
return x switch
{
< 0 => ValidationResult.Error("[red]You were not born yet[/]"),
> 120 => ValidationResult.Error("[red]You are too old[/]"),
_ => ValidationResult.Success(),
};
}));여기서 프롬프트는 표준 입력 스트림의 문자열 값을 숫자 유형으로 변환할 뿐만 아니라 비즈니스 규칙에 따라 오류 검사도 수행합니다. 예를 들어 음수 나이는 허용하지 않습니다. Tim이 직접 테스트해봤습니다(8:31): -1을 입력하면 "당신은 아직 태어나지 않았습니다."라는 메시지가 나오고, 150을 입력하면 "당신은 너무 늙었습니다."라는 메시지가 나옵니다. 유효한 입력값만 다음 줄로 넘어갑니다.

이 내장 유효성 검사 기능 덕분에 main 함수에서 if 문을 수동으로 작성하거나, 구문 분석 메서드를 호출하거나, 예외를 처리할 필요가 없어집니다.
질문하기 vs. 유도하기: 각각 언제 사용해야 할까요?
오전 9시에 팀이 다음과 같이 요약합니다.
Ask: 빠르고 간단합니다. 프로그램에서 입력 매개변수 하나만 읽어서 알려진 유형으로 변환하면 될 때 가장 적합합니다.
- 프롬프트: 더 강력합니다. 선택 항목, 기본값 및 유효성 검사를 추가할 수 있습니다. 더욱 풍부한 기능을 갖춘 콘솔 애플리케이션을 개발하거나 명령줄 인수를 사용하여 실행 파일을 호출하는 다른 프로그램과 통합할 때 유용합니다.
두 접근 방식 모두 여전히 static void Main(string[] args) 또는 public static void Main(string[] args) 진입점에 깔끔하게 들어맞습니다. 또한 args에 접근하여 프로그램 실행 시 전달된 명령줄 인수를 읽고, 이를 Spectre.Console 프롬프트와 결합한 다음, string.Format 또는 보간을 사용하여 깔끔하게 서식이 지정된 문자열을 출력할 수 있습니다.
콘솔 개발자에게 중요한 이유
Tim은 (9:19) 이 접근 방식이 "사용자로부터 입력을 요청하는 능력을 한 단계 더 높여준다"고 언급하며 마무리합니다. Spectre.Console을 사용하면 더 이상 키보드 입력을 읽고, Convert 클래스로 변환하고, 기본 메시지를 표시하는 반복적인 코드를 작성할 필요가 없습니다. 대신에 다음과 같은 것을 얻게 됩니다:
명령 프롬프트에 풍부한 색상 출력을 제공합니다.
숫자형, 실수형 값 또는 문자열 값을 자동으로 구문 분석합니다.
잘못된 입력에 대한 사용자 친화적인 오류 처리 기능.
- 프롬프트와 기존 명령줄 인수를 결합하여 하이브리드 입력 모델을 구현할 수 있는 기능.
이를 통해 초보자에게 main 메서드, 데이터 유형 및 입력 매개변수에 대해 더 쉽게 가르칠 수 있을 뿐 아니라 Visual Studio 또는 다른 편집기에서 전문가 수준의 콘솔 애플리케이션을 작성할 수 있습니다.
결론
영상 에서 팀 코리의 설명을 따라하면 다음을 배울 수 있습니다.
Spectre.Console의 Ask를 사용하여 사용자 입력을 읽고 변환하는 방법.
TextPrompt를 사용하여 선택지, 기본값, 검증을 제공하는 방법.
이러한 프롬프트가 명령줄 인수와 함께 Main(string[] args) 진입점에 자연스럽게 통합되는 방식입니다.
- 반복적인 오류 검사 작업을 줄이고 명령줄 앱을 더욱 사용자 친화적으로 만드는 방법.
Tim이 보여주는 모든 내용은 여전히 단일 실행 파일로 컴파일되어 명령 프롬프트에서 실행하거나, 인수를 전달하거나, 더 큰 Windows Forms 응용 프로그램이나 도구에 포함할 수 있습니다. 이는 C# 콘솔의 단순함과 친숙한 main 함수의 장점을 유지하면서 사용자 입력을 처리하는 현대적인 방식입니다.

