본문 바로가기
C#

C#이 지원하는 패턴

by 돌맹96 2023. 7. 19.
728x90
반응형

* 선언 패턴
주어진 식이 특정 형식과 일치하는지 평가
1. 식과 주어진 형식과 일치하는지 테스트
2. 테스트가 성공하면 식을 주어진 형식으로 변환

예시

object foo = 23;
if(foo is int)
{
    Console.WriteLine(foo);
}

foo is int가 true가 반환되는 경우 bar 변수가 if 블록에서 생성 false인 경우 생성되지 않음.

 

* 형식 패턴

형식 패턴은 선언 패턴과 비슷하지만, 변수 생성 없이 형식 일치 여부만 테스트.(C# 9.0에서 적용)

object foo = 23;
if(foo is int)
{
    Console.WriteLine(foo);
}

선언 형식 예제와 다 똑같지만 패턴 매칭이 적용되어 변수를 추가적으로 생성하지 않음.

 

* 상수 패턴

상수 패턴은 식이 특정 상수와 일치하는 검사

정수 리터럴과 문자열 리터럴뿐 아니라 null과 enum 등 모든 상수와 매칭할 수 있다.

var GetCountryCode = (string nation) => nation switch
{
    "KR" => 82,
    "US" => 1,
    "UK" => 44,
    _ => throw new ArgumentException("Not supported Code")
};

Console.WriteLine(GetCountryCode("KR"));
Console.WriteLine(GetCountryCode("US"));
Console.WriteLine(GetCountryCode("UK"));

* 프로퍼티 패턴

프로퍼티 패턴 매칭은 식의 속성이나 필드가 패턴과 일치하는지 검사. 기본 데이터 형식이 아닌 경우에 유용하게 사용가능

class Car {
  public string Model {get; set;}
  public DateTime ProducedAt { get; set;}
}

static string GetNickname(Car car)
{
    var GenerateMessage = (Car car, string nickname) => $"{car.Model} produced in {car.ProducedAt.Year} is {nickname}";
    
    if(car is Car {Model:"Mustang", ProducedAt.Year:1967})
        return GenerateMessage(car, "Fastback");
    else if(car is Car {Model:"Mustang", ProducedAt.Year:1976})
        return GenerateMessage(car, "Cobra II");
    else
        return GenerateMessage(car, "UnKnown");
}

static void Main(string[] args)
{
    Console.WriteLine(
        GetNickname(
            new Car() {Model = "Mustang", ProducedAt = new DateTime(1967, 11, 23)}));
    Console.WriteLine(
        GetNickname(
            new Car() {Model = "Mustang", ProducedAt = new DateTime(1976, 6, 7)}));
    Console.WriteLine(
        GetNickname(
            new Car() {Model = "Mustang", ProducedAt = new DateTime(2099, 12, 25)}));
}

* 관계 패턴

관계 패턴 매칭은 >,>=,==,!=,<,<= 와 같은 관계 연산자를 이용하여 입력받은 식을 상수와 비교

 

* 논리 패턴

패턴과 패턴을 논리 연산자(and, or, not)을 조합해서 하나의 논리 패턴으로 만듬.

 

* 괄호 패턴

괄호 패턴은 소괄호 ()로 감싼다. 보통 논리 패턴으로 여러 패턴을 조합할때 사용

 

* 위치 패턴

위치 패턴은 식의 결과를 분해하고, 분해된 값들이 내장된 복수의 패턴과 일치하는지 검사.

분해된 값들과 내장된 패턴의 개수, 순서가 일치해야 한다는 점에 주의 

Tuple<string, int> itemPrice = new Tuple<string, int>("espresso", 3000);

if(itemPrice is ("espresso", < 5000))
{
    Console.WriteLine("The coffee is affordable.");
}

이 예제에서 ("espresso") 와 (<5000) 으로 이루어진 위치 패턴으로 매칭되어 있다.

 

* var 패턴

var 패턴은 null을 포함한 모든 식의 패턴 매칭을 성공시키고, 그 결과를 변수에 할당

 

* 무시 패턴

무시패턴도 var 패턴처럼 모든 식과 패턴 일치 검사를 성공시킨다. 하지만 is에서는 사용불가 switch식에만 사용가능

switch의 default 케이스와 비슷한 용도로 사용가능. 무시패턴은 _ 기호를 사용한다.

 

* 목록 패턴

목록패턴은 배열이나 리스트가 패턴의 시퀀스가 일치하는지 검사.

728x90
반응형