12.3 패턴 매칭 소개
다른 많은 기능과 마찬가지로 패턴 매칭은 C#에서는 새롭게 소개된 기능이지만, 모든 프로그래밍 언어를 아울러 봤을 때는 완전히 새로운 기능은 아니다. 특히 함수형 언어(functional language)는 패턴을 상당히 많이 사용하는 편이다. C# 7.0에 포함된 패턴 기능은 자주 사용되는 패턴의 용례들을 수용하고 있기는 하지만, 언어의 문법적 구조에 맞추다 보니 다소 부족한 부분이 있다.
패턴의 기본적인 아이디어는 값의 몇 가지 측면을 살피고, 그 결과를 기반으로 추가적인 동작을 수행하는 것이다. 그렇다. 이는 마치 if 문 이야기를 하는 것처럼 들릴 것이다. 하지만 패턴은 조건을 위한 더 많은 문맥 정보를 제공하거나 패턴을 기반으로 추가적 동작을 수행할 때 더 많은 문맥 정보를 제공한다. 하지만 이 기능을 이용한다고 해서 이전에 할 수 없던 일을 갑자기 할 수 있게 되는 것은 아니다. 하지만 이 기능을 이용하면 우리가 의도하는 바를 좀 더 명확하게 표현할 수 있다.
구체적인 예를 들지 않고 줄곧 설명만 하는 것은 내가 원하는 바가 아니며, 이번에도 마찬가지다. 하지만 다소 장황하게 설명을 이어가는 이유는 패턴 매칭 나름의 고유한 운치를 느껴봤으면 하기 때문이다. 우선 abstract로 선언된 Area라는 속성을 가진 abstract Shape 클래스가 있다고 해보자. 그리고 이 클래스를 상속하여 Rectangle, Circle, Triangle 등을 작성할 것이다. 불행히도 현재 개발 중인 응용프로그램에서는 도형의 넓이(area)가 아니라 둘레 길이가 필요하고, Shape를 수정할 수 없어 Perimeter라는 속성을 추가할 수도 없다(전체 소스 코드에 대한 제어권이 없을 수도 있다). 다행히 각 클래스별로 둘레의 길이를 계산하는 방법을 알고 있다면, C# 7 이전에는 Perimeter 메서드를 다음과 같이 구현할 수 있을 것이다.