패턴 매칭 (Pattern Matching )
Pattern Matching은 C# 7.0 버전부터 지원되는 기능으로, 단순한 값 비교뿐 아니라 여러 종류의 패턴을 사용하여 객체나 데이터 구조체의 값을 비교하고 추출할 수 있다.
주로 조건문(if)나 분기(Switch)에서 사용하고 다양한 패턴을 활용해서 코드를 간결하고 가독성 있게 작성이 가능하다.
반응형
< 예시코드 -1 >
정보를 기반으로 로그인하는 예시를 보면 다음과 같다.
using System;
public enum LoginStatus
{
Success,
InvalidUsername,
InvalidPassword
}
public class User
{
public string Username { get; set; }
public string Password { get; set; }
}
public LoginStatus ValidateLogin(User user, string inputUsername, string inputPassword)
{
switch (user)
{
case User { Username: var username, Password: var password } when username != inputUsername:
return LoginStatus.InvalidUsername;
case User { Username: var username, Password: var password } when password != inputPassword:
return LoginStatus.InvalidPassword;
case null:
return LoginStatus.InvalidUsername;
default:
return LoginStatus.Success;
}
}
public void LoginProgress()
{
// 예를 들어, 데이터베이스에서 가져온 사용자 정보라고 가정합니다.
User user = new User { Username = "john.doe", Password = "password123" };
string inputUsername = "john.doe";
string inputPassword = "wrongPassword";
LoginStatus loginStatus = ValidateLogin(user, inputUsername, inputPassword);
switch (loginStatus)
{
case LoginStatus.Success:
Console.WriteLine("로그인 성공!");
break;
case LoginStatus.InvalidUsername:
Console.WriteLine("잘못된 사용자 이름입니다.");
break;
case LoginStatus.InvalidPassword:
Console.WriteLine("잘못된 비밀번호입니다.");
break;
default:
Console.WriteLine("알 수 없는 오류가 발생했습니다.");
break;
}
}
반응형
< 예시코드 -2 ( 연산자 패턴 ) >
두개 이상의 패턴을 조합하여 검사하는 패턴
switch (obj)
{
case int i and > 0:
Console.WriteLine("양의 정수: " + i);
break;
case int i and < 0:
Console.WriteLine("음의 정수: " + i);
break;
default:
Console.WriteLine("다른 값");
break;
}
< 예시코드 -3 (배열패턴) >
배열 패턴(Array Pattern) : 배열의 요소를 패턴으로 검사할 수 있는 기능
switch (array)
{
case int[] { Length: 0 }:
Console.WriteLine("빈 배열");
break;
case int[] { Length: 1 } { [0]: var singleValue }:
Console.WriteLine("단일 값 배열: " + singleValue);
break;
case int[] { Length: var length }:
Console.WriteLine("배열 길이: " + length);
break;
}
★★☆☆☆
반응형
댓글