본문 바로가기

C#

[C#] 패턴 매칭

패턴매칭은 어떤 대상이 특정한 패턴을 가지고 있는지를 찾는 방법입니다. 조건을 제시하여 해당 조건에 맞는 객체들을 가져와 사용할 수 있는 방법중에 하나입니다.

 

예제를 통해 알아보겠습니다!

 

아래와 같은 조건에서 데이터를 찿을 때 보통 Equals를 사용합니다.

 

        object[] datas = { 1, 3, null, new Student("Hyo", 70) };

        foreach (var data in datas)
        {
            if (data.Equals(1))
                Debug.Log("1 입니다");
            else if (data.Equals(null))
                Debug.Log("null 입니다");

        }

 

c# 7.0 상수 패턴

        object[] datas = { 1, 3, null, new Student("Hyo", 70) };

        foreach (var data in datas)
        {
            if (data is 1)
                Debug.Log("1 입니다");
            else if (data is null)
                Debug.Log("null 입니다");
        }

is 연산자는 보통 캐스팅을 통해 true/ false를 반환할 때 사용하는데요, 뒤에 상수를 사용하여 사용할 수 있습니다.

이렇게 Equals 대신 상수 패턴으로 사용할 수 있습니다!

 

c# 7.0 타입 패턴

        object[] datas = { 1, 3, null, new Student("Hyo", 70) };

        foreach (var data in datas)
        {
            if (data is Student student)
                Debug.Log($"{student.name}, {student.score}");
        }

타입 패턴은 파생클래스인지, 인터페이스를 가지고 있는지를 파악할 수 있습니다. 해당 타입이 맞으면 data를 Student 타입으로 변경하여 student에 저장합니다. 따라서 특별한 캐스팅 없이 저장된 변수를 직접 사용할 수 있습니다.

 

c# 7.0 var 패턴

    private void CheckNumber(int num)
    {
        switch (num)
        {
            case var _num when _num < 5:
                Debug.Log("5 미만의 숫자");
                break;
            case var _num when _num.Equals(3):
                Debug.Log("3인 숫자");
                break;
            default:
                break;
        }
    }

vsr 패턴은 상수 패턴, 타입 패턴 모두를 포함할 수 있는 장점이 있습니다. 하지만 더 유용하게 쓰는 방법중에 when 키워드와 함께 사용하면 더욱 효율적이고 유용하게 사용할 수 있습니다.

 

c# 8.0 switch expression

    private string GetJob(People people)
    {
        string job = people switch
        {
            null                        => "백수",
            Student student             => "학생",
            OfficeWorker officeWorker   => "직장인",
            Streamer streamer           => "스트리머",
            _ => throw new ArgumentException()
        };

        return job;
    }

기존의 switch문과 조금 바뀐 형태로 expression 형태와 함께 사용할 수 있습니다.

case, break, default를 사용하지 않아서 편리하다는 장점이 있습니다!

default는 _로 표현하면 됩=\니다!

또한 expression 형태이기 때문에 세미콜론을 사용하지 않는 특징이 있습니다.