12.4.2 타입 패턴
타입 패턴(type pattern)은 타입과 식별자로 구성된다. 이는 마치 변수 선언과 유사하다. 이 패턴은 input이 주어진 타입의 값인지 확인하는데, 이러한 동작은 is 연산자와 매우 유사하다. 이 같은 패턴을 사용하면 패턴이 일치할 때 주어진 값으로 새롭게 초기화되는 패턴 변수(pattern variable)를 사용할 수 있는 이득이 있다. 패턴이 일치하지 않더라도 패턴 변수가 존재하기는 하겠지만, 어떤 값도 할당되지 않은 상태로 남게 된다. input이 null인 경우에는 어떤 타입과도 일치하지 않는다. 12.1.1절에서 살펴본 밑줄 식별자(_)를 사용할 수도 있는데, 이 경우 어떤 변수도 생성되지 않고 값은 버려진다(discard). 다음 코드는 as에 연이어 if 문을 사용했던 예제 12-10에 패턴 매칭을 적용한 예인데, 아직까지 switch 문을 이용한 극단적인 최적화는 수행하지 않은 모습이다.
예제 12-13 as/if 대신 타입 패턴 사용 ▶ ShapePerimeterWithPatternsIfElse.cs
static double Perimeter(Shape shape)
{
if (shape == null)
throw new ArgumentNullException(nameof(shape));
if (shape is Rectangle rect)
return 2 * (rect.Height + rect.Width);
if (shape is Circle circle)
return 2 * PI * circle.Radius;
if (shape is Triangle triangle)
return triangle.SideA + triangle.SideB + triangle.SideC;
throw new ArgumentException(
$"Shape type {shape.GetType()} perimeter unknown", nameof(shape));
}