switch문은 프로그래밍 언어에서 유서 깊은 역사를 지니고 있어요. 처음에는 C에서 도입되었고, 속도가 빠르다는 점에서 높이 평가받았어요. 그런데 그 속도는 기능이 크게 제한적이라는 대가를 치르고 얻은 것이었어요. C#에서는 switch문의 역할이 정수를 넘어 확장되었어요. switch문은 임의의 타입, 값, 참조를 모두 아우를 수 있어요.
함수형 언어에서 오셨다면, switch문(그리고 다른 곳에서 다루는 switch 식)을 다루는 것이 C#에서 판별 공용체와 패턴 매칭을 사용하는 것에 가장 가까이 다가가는 방법이에요. 하지만 타입 안전성을 강제하는 판별 공용체의 힘에는 턱없이 못 미쳐요.
단순한 switch문은 switch, case, break, default를 조합한다는 점에서 C 시절의 조상과 닮아 있어요.
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
위 패턴은 모든 단순한(원시 형식 + 문자열) 타입에 사용할 수 있어요.
여기에 참조 형식이 섞이면 추가 문법이 필요해요. 먼저 타입을 다운캐스트하고, 그다음 가드(when)를 추가하는 거예요. 물론 가드는 단순한 값 case에도 사용할 수 있어요. 아래에 예시가 있어요.
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default 절은 선택 사항이지만, 대개 있는 편이 좋아요.case 절에는 break문이 반드시 필요해요.case 레이블에 전달하는 모든 인자의 타입은 switch 인자의 타입에서 파생되어야 해요. Object 타입의 switch 인자는 당연히 가장 넓은 범위를 허용하죠.case 인자의 멤버뿐만 아니라 스코프 안의 어떤 것이든 포함할 수 있어요.case 인자를 가진 여러 case가 같은 코드 블록을 가리킬 수 있어요.switch문 문서에서 switch문에 대한 소개를 볼 수 있어요.