이 자습서에서는 패턴 일치를 사용하여 C#에서 데이터를 검사하는 방법을 설명합니다. 소량의 코드를 작성한 다음, 해당 코드를 컴파일하고 실행합니다. 이 자습서에는 C#에서 지원하는 다양한 종류의 패턴을 탐색하는 일련의 단원이 포함되어 있습니다. 이러한 단원에서는 C# 언어의 기본 사항을 설명합니다.
이 자습서에서는 다음을 수행합니다.
- C# 개발 환경을 사용하여 GitHub Codespace를 시작합니다.
- 불연속 값에 대한 데이터를 테스트합니다.
- 열거형 데이터를 값과 비교합니다.
- 표현식을 사용하여
switch완전한 일치를 생성합니다. - 형식 패턴을 사용하여 타입을 일치시킵니다.
필수 조건
다음 중 하나가 있어야 합니다.
- GitHub Codespaces를 사용하는 GitHub 계정입니다. 아직 계정이 없는 경우 GitHub.com 체험 계정을 만들 수 있습니다.
- 다음 도구가 설치된 컴퓨터:
값을 일치시키다
**
이전 자습서에서는 기본 제공 형식과 사용자가 튜플 또는 레코드로 정의하는 형식을 보여주었습니다.
패턴에 대해 이러한 형식의 인스턴스를 확인할 수 있습니다. 인스턴스가 패턴과 일치하는지 여부에 따라 프로그램에서 수행하는 작업이 결정됩니다. 아래 예제에서는 형식 이름 뒤에 ?가 표시됩니다. 이 기호를 사용하면 이 형식의 값이 null이 될 수 있습니다(예: bool? 일 수 있음truefalse)null 자세한 내용은 Nullable 값 형식을 참조하세요. 패턴을 사용하는 방법을 알아보겠습니다.
GitHub 코드스페이스에 대한 브라우저 창을 엽니다. .NET 템플릿에서 새 코드스페이스를 만듭니다. 이 시리즈의 다른 자습서를 완료한 경우 해당 코드 영역을 열 수 있습니다.
코드스페이스가 로드되면 patterns.cs라는 자습서 폴더에 새 파일을 만듭니다.
새 파일을 엽니다.
이 자습서의 모든 예제에서는 일련의 은행 거래를 나타내는 텍스트 입력을 CSV(쉼표로 구분된 값) 입력으로 사용합니다. 각 샘플에서
is식 또는switch식을 사용하여 레코드를 패턴과 일치시킬 수 있습니다. 첫 번째 예제에서는 문자의,각 줄을 분할한 다음 식을 사용하여 첫 번째 문자열 필드를 "DEPOSIT" 또는 "WITHDRAWAL" 값과is합니다. 일치하는 경우 트랜잭션 금액이 현재 계정 잔액에서 추가되거나 공제됩니다. 작동하는지 확인하려면 다음 코드를 patterns.cs에 추가하십시오.string bankRecords = """ DEPOSIT, 10000, Initial balance DEPOSIT, 500, regular deposit WITHDRAWAL, 1000, rent DEPOSIT, 2000, freelance payment WITHDRAWAL, 300, groceries DEPOSIT, 700, gift from friend WITHDRAWAL, 150, utility bill DEPOSIT, 1200, tax refund WITHDRAWAL, 500, car maintenance DEPOSIT, 400, cashback reward WITHDRAWAL, 250, dining out DEPOSIT, 3000, bonus payment WITHDRAWAL, 800, loan repayment DEPOSIT, 600, stock dividends WITHDRAWAL, 100, subscription fee DEPOSIT, 1500, side hustle income WITHDRAWAL, 200, fuel expenses DEPOSIT, 900, refund from store WITHDRAWAL, 350, shopping DEPOSIT, 2500, project milestone payment WITHDRAWAL, 400, entertainment """; double currentBalance = 0.0; var reader = new StringReader(bankRecords); string? line; while ((line = reader.ReadLine()) is not null) { if (string.IsNullOrWhiteSpace(line)) continue; // Split the line based on comma delimiter and trim each part string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") currentBalance += amount; else if (transactionType?.ToUpper() is "WITHDRAWAL") currentBalance -= amount; Console.WriteLine($"{line.Trim()} => Parsed Amount: {amount}, New Balance: {currentBalance}"); } }그런 다음 터미널 창에 다음 텍스트를 입력합니다.
cd tutorials dotnet patterns.cs출력을 검사합니다. 첫 번째 필드의 텍스트 값을 비교하여 각 줄이 처리되는 것을 볼 수 있습니다.
마찬가지로 연산자를 사용하여 == 두 string 값이 같은지 테스트하여 이전 샘플을 생성할 수 있습니다. 변수를 상수와 비교하는 것은 패턴 일치를 위한 기본 구성 요소입니다. 패턴 일치의 일부인 더 많은 구성 요소를 살펴보겠습니다.
열거형 매칭
패턴 일치의 또 다른 일반적인 용도는 enum 형식의 값에 대한 일치입니다. 다음 샘플에서는 입력 레코드를 처리하여 첫 번째 값 이 입금 또는 인출을 기록하는 값인 enum을 만듭니다. 두 번째 값은 트랜잭션의 값입니다.
소스 파일의 끝에 다음 코드를 추가합니다. 열거형을
TransactionType정의합니다.public enum TransactionType { Deposit, Withdrawal, Invalid }은행 트랜잭션을 트랜잭션 유형 및 트랜잭션 값을 보유하는 튜플로 구문 분석하는 함수를 추가합니다. 열거형 선언
TransactionType앞에 다음 코드를 추가합니다.static IEnumerable<(TransactionType type, double amount)> TransactionRecords(string inputText) { var reader = new StringReader(inputText); string? line; while ((line = reader.ReadLine()) is not null) { string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") yield return (TransactionType.Deposit, amount); else if (transactionType?.ToUpper() is "WITHDRAWAL") yield return (TransactionType.Withdrawal, amount); } else { yield return (TransactionType.Invalid, 0.0); } } }선언한 열거형을 사용하여
TransactionType트랜잭션 데이터를 처리하는 새 루프를 추가합니다.currentBalance = 0.0; foreach (var transaction in TransactionRecords(bankRecords)) { if (transaction.type == TransactionType.Deposit) currentBalance += transaction.amount; else if (transaction.type == TransactionType.Withdrawal) currentBalance -= transaction.amount; Console.WriteLine($"{transaction.type} => Parsed Amount: {transaction.amount}, New Balance: {currentBalance}"); }
앞의 예제에서는 if 문을 사용하여 enum 식의 값을 확인합니다. 패턴 일치의 또 다른 형식은 switch 식을 사용합니다. 해당 구문과 이 구문을 사용하는 방법을 살펴보겠습니다.
포괄적인 일치 항목 switch
조건을 테스트할 수 있는 일련의 if 문이 있습니다. 그러나 컴파일러는 일련의 if 문이 완전한지 혹은 이후 if 조건이 이전 조건에 의해 포함되는지 알 수 없습니다.
포괄적인 것은 일련의 테스트 중 if 또는 else 절 중 하나가 모든 가능한 입력을 처리하는 것을 의미합니다. 일련의 if 문이 완전할 경우, 가능한 모든 입력은 적어도 하나의 if 절 또는 else 절을 충족합니다.
포섭은 앞의 if 또는 else 절이 가능한 모든 입력과 일치하기 때문에 뒤의 if 또는 else 절에 도달할 수 없다는 것을 의미합니다. 예를 들어 다음 예제 코드에서는 하나의 절이 일치하지 않습니다.
int n = GetNumber();
if (n < 20)
Console.WriteLine("n is less than 20");
else if (n < 10)
Console.WriteLine("n is less than 10"); // unreachable
else
Console.WriteLine("n is greater than 20");
else if 10보다 작은 모든 숫자도 20보다 작기 때문에 절이 일치하지 않습니다. 이 식은 switch 이러한 특성을 모두 충족하도록 보장하여 앱에서 버그를 줄입니다. 시도하고 실험해 봅시다.
다음 코드를 복사합니다.
foreach루프의 두if문을 여러분이 복사한switch표현식으로 교체하십시오.currentBalance += transaction switch { (TransactionType.Deposit, var amount) => amount, (TransactionType.Withdrawal, var amount) => -amount, _ => 0.0, };터미널 창에 입력
dotnet patterns.cs하여 새 샘플을 실행합니다.코드를 실행하면 코드가 동일하게 작동하는 것을 볼 수 있습니다.
포섭을 보여 주려면 다음 코드 조각과 같이 스위치 암의 순서를 다시 지정합니다.
currentBalance += transaction switch { (TransactionType.Deposit, var amount) => amount, _ => 0.0, (TransactionType.Withdrawal, var amount) => -amount, };스위치 암의 순서를 다시 지정한 후 터미널 창에 입력
dotnet patterns.cs합니다. 컴파일러는_와 일치하는 조건이 모든 값에 해당하기 때문에 오류를 보고합니다. 결과적으로, 그 마지막 코드 부분은TransactionType.Withdrawal결코 실행되지 않습니다. 컴파일러는 코드에 문제가 있음을 알려줍니다.컴파일러는
switch표현식에서 테스트된 식이 어떤 스위치 암과도 일치하지 않는 값을 포함할 수 있는 경우 경고를 발생시킵니다. 일부 값이 조건과 일치하지 않을 수 있는 경우 식이switch완전하지 않습니다. 또한 입력의 일부 값이 스위치 암과 일치하지 않으면 컴파일러에서 경고를 발생합니다._ => 0.0,줄을 제거하여 잘못된 값이 일치하지 않도록 합니다.dotnet patterns.cs을 입력하여 결과를 확인합니다.컴파일러에서 경고를 실행합니다. 테스트 데이터가 유효하므로 프로그램이 작동합니다. 그러나 잘못된 데이터가 있으면 런타임에 오류가 발생합니다.
형식 패턴
이 자습서를 완료하려면 패턴 일치를 위한 하나 이상의 구성 요소인 형식 패턴을 탐색합니다.
형식 패턴은 런타임에 식을 테스트하여 지정된 형식인지 확인합니다.
is 식 또는 switch 식과 함께 타입 테스트를 사용할 수 있습니다. 두 가지 방법으로 현재 샘플을 수정합니다. 먼저 튜플 대신 트랜잭션을 나타내는 형식을 빌드 Deposit 하고 Withdrawal 기록합니다.
코드 파일의 끝에 다음 선언을 추가합니다.
public record Deposit(double Amount, string description); public record Withdrawal(double Amount, string description);열거형 선언 바로 앞에 이 메서드를
TransactionType추가합니다. 텍스트를 구문 분석하고 일련의 레코드를 반환합니다.static IEnumerable<object?> TransactionRecordType(string inputText) { var reader = new StringReader(inputText); string? line; while ((line = reader.ReadLine()) is not null) { string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") yield return new Deposit(amount, parts[2]); else if (transactionType?.ToUpper() is "WITHDRAWAL") yield return new Withdrawal(amount, parts[2]); } yield return default; } }마지막
foreach루프 다음에 다음 코드를 추가합니다.currentBalance = 0.0; foreach (var transaction in TransactionRecordType(bankRecords)) { currentBalance += transaction switch { Deposit d => d.Amount, Withdrawal w => -w.Amount, _ => 0.0, }; Console.WriteLine($" {transaction} => New Balance: {currentBalance}"); }터미널 창에 입력
dotnet patterns.cs하여 결과를 확인합니다. 이 최종 버전은 형식에 대한 입력을 테스트합니다.
패턴 일치는 식을 특성과 비교하는 어휘를 제공합니다. 패턴에는 식의 형식, 형식 값, 속성 값 및 조합이 포함될 수 있습니다. 패턴과 식을 비교하는 것은 여러 if 비교보다 명확할 수 있습니다. 식과 일치하는 데 사용할 수 있는 몇 가지 패턴을 살펴보했습니다. 애플리케이션에서 패턴 일치를 사용하는 방법에는 여러 가지가 있습니다. 탐색하는 동안 다음 문서에서 C#에서 패턴 일치에 대해 자세히 알아볼 수 있습니다.
- C#에서의 패턴 일치
- 패턴 일치 자습서 살펴보기
- 패턴 일치 시나리오
리소스 정리
GitHub는 30일 동안 비활성 상태이면 Codespace를 자동으로 삭제합니다. 이 시리즈의 모든 자습서를 완료했습니다. 이제 Codespace를 삭제하려면 브라우저 창을 열고 Codespaces로 이동합니다. 창에 코드스페이스 목록이 표시됩니다. 학습 자습서 코드스페이스에 대한 항목에서 점 3개(...)를 선택하고 삭제를 선택합니다.
관련 콘텐츠
- .NET 10 SDK를 다운로드하여 설치합니다.
- Visual Studio Code를 다운로드하여 설치합니다.
- C# DevKit을 다운로드하여 설치합니다.
- C# 기본 사항 섹션을 탐색하여 C#에 대해 자세히 알아보세요.
.NET