더북(TheBook)

일반적으로 여러 개의 case가 있으면 그중 단 하나의 case 본문만 수행되지만, 아주 드물게 본문 내에서 goto 문을 사용하기도 한다. 패턴을 사용하는 switch 문에서도 goto 문을 사용할 수 있다. 다만 몇 가지 제약이 있는데, 우선 상숫값을 사용해야 하고 가드 절을 가져서는 안 된다. 예를 들면 goto 문을 이용하여 타입 패턴으로 이동할 수는 없고, true로 평가되는 가드 절을 가지고 있는 case 문으로도 goto를 이용하여 이동할 수 없다. switch 문 내에서 goto 문을 사용하는 몇몇 사례를 봤지만, 이러한 제약이 큰 문제가 되지는 않을 것이다.

지금까지 논리적 평가 순서에 대해서 신중히 살펴봤다. C# 컴파일러는 효율을 높이기 위해서 switch 문을 일련의 if/else 문으로 변환하기도 한다. 그리고 이 같은 변환 작업 이외에도 효율성을 높이기 위한 다른 과정들이 수행된다. 예를 들어 동일한 타입으로 패턴 매칭을 하지만 서로 다른 가드 절을 가지고 있는 case 문이 여럿 있다면, 패턴 매핑을 우선적으로 수행한 후 가드 절의 조건을 각기 살피는 형태로 최적화를 수행한다. 이와 유사하게, 상숫값을 사용하되 가드 절을 사용하지 않는다면(이전 C#에서 사용하던 방식처럼) 암시적 타입 검사를 수행한 후에 switch에 해당하는 IL 명령어를 생성한다. 컴파일러가 수행하는 정확한 최적화 방식을 설명하는 것은 이 책의 범위를 벗어난다. switch 문을 컴파일한 IL 코드를 봤을 때 소스 코드와 전혀 유사하지 않다면 이러한 최적화 과정이 원인일 수 있음을 알아 두기 바란다.

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