본문 바로가기
개발/기본) 기본기

기본기) 패턴 매칭 (Pattern Matching )

by 테샤르 2024. 3. 18.

패턴 매칭 (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;
}

 

 

 

 

 

 

 

★★☆☆☆

 

반응형

댓글