더북(TheBook)

때로 이는 전혀 문제가 되지 않는다. 앞서 예로 살펴봤던 피보나치 수열 계산 함수 내에서 모든 case 문은 0, 1, 그리고 1보다 큰 수 이렇게 세 가지로 나뉘어 있으며, 그 각각은 순서를 바꿔도 문제가 되지 않는다. 하지만 Noda Time 도구 코드에 나오는 네 개의 case 문은 반드시 순서대로 수행되어야 한다.

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(...);

이 코드에서는 useTypeArgumentNames 값이 true이면(첫 번째 case), 다른 case 문은 고려하지 않고 항상 제네릭 타입 매개변수의 이름을 가져온다. 두 번째와 세 번째 조건은 상호 배타적이라 (개발자는 알지만 컴파일러는 이를 알지 못한다.) 중복되는 경우가 없으므로 순서가 뒤바뀌어도 상관없다. 마지막 case 문은 네 개의 case 문 내에서 항상 가장 마지막에 두어야 하는데, GenericParameter 타입의 입력이 다른 case 문에 부합하지 않는 경우 예외를 던지기 위해 작성된 코드이기 때문이다.

이때 컴파일러가 일부 도움을 주기도 한다. 마지막 case 문을 보면 가드 절이 포함되어 있지 않은데, 이 또한 타입 패턴 매치를 사용할 때 유용한 문법이다. 컴파일러는 이 같은 case 문을 동일한 패턴을 사용하는 다른 case 문보다 앞쪽에 두면 다른 case 문의 조건이 무용지물이 된다는 사실을 잘 알고 있으며, 이 경우 컴파일 오류를 출력한다.

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