더북(TheBook)

가드 절을 사용한 예를 살피다 보면, 패턴이 매칭되더라도 가드 절이 false로 평가될 수 있기 때문에 동일한 패턴이 반복적으로 나타나는 것이 일반적이다. 다음은 Noda Time 도구 코드 내에서의 사용 예다.

private string GetUid(TypeReference type, bool useTypeArgumentNames)
{
    switch (type)
    {
        case ByReferenceType brt:
            return $"{GetUid(brt.ElementType, useTypeArgumentNames)}@";
        case GenericParameter gp when useTypeArgumentNames:
            return gp.Name;
        case GenericParameter gp when gp.DeclaringType != null:
            return $"`{gp.Position}";
        case GenericParameter gp when gp.DeclaringMethod != null:
            return $"``{gp.Position}";
        case GenericParameter gp:
            throw new InvalidOperationException(
                "Unhandled generic parameter");
        case GenericInstanceType git:
            return "(This part of the real code is long and irrelevant)";
        default:
            return type.FullName.Replace('/', '.');
    }
}

이 예제는 제네릭 매개변수를 처리하는 네 가지 패턴을 포함하고 있다. 이 패턴들은 우선 useTypeArgumentNames 값을 기반으로 제네릭 타입을 처리한다. 다음으로 제네릭 타입 매개변수가 메서드에 사용된 것인지, 타입에 사용된 것인지를 확인한다. 예외를 던지는 case 문은 제네릭 매개변수 처리에서는 마치 default와 같은 역할을 수행하는데, 전혀 예상할 수 없었던 상황이 발생했음을 나타내기 위한 것이다. 이 경우에도 여러 case에 걸쳐서 동일한 패턴 변수인 gp를 반복해 사용하고 있다는 것을 알 수 있으며, 이는 자연스럽게 case 레이블에서 사용한 패턴 변수의 사용 범위에 대한 질문으로 이어진다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.