의도하지 않은 스위치 실패는 수정하기 쉽습니다. 매 case 끝마다 break 문을 붙이면 그만입니다. 위 코드 예제에서처럼요.
이제 코드에 버그는 없지만 switch가 정말 가장 완벽한 대안일까요? 절대로 아닙니다!
예제에서 switch는 분리해야 할 두 가지 관심사를 섞고 있습니다. 허가받지 않은 접근과 허가된 접근을 하나의 코드 블록으로 합쳤죠.
경험상 서로 다른 관심사는 서로 다른 코드 블록에 넣어야 합니다(1.8 코드 대칭 이루기)에서 좀 더 자세히 살펴보겠습니다). 이렇게 하면 첫째, 코드가 읽기 더 쉬워집니다. 둘째, 스위치 실패와 같은 우연한 버그가 발생할 가능성이 줄어듭니다.
switch로는 관심사를 분리하기 어렵습니다. 그래서 if 문을 사용하는 방법을 선호합니다. 하지만 그렇더라도 괄호 사용하기에서 항상 볼 수 있듯이 스위치 실패가 발생할 수 있습니다.
누군가 다른 줄을 추가하면 어떻게 될까요? 이 조건에 맞추어 조정해야 하는데 잊어버리기 쉽습니다. 코드는 여전히 잘 실행될 것이고 뭔가를 놓쳤다는 사실을 전혀 눈치채지 못할 거에요! 그래서 코딩하지 않은 값을 명시적으로 처리하는 예비 분기(branch)가 항상 있어야 합니다. 스위치 문은 default 케이스로 이러한 기능을 제공합니다. 또는 AssertionError를 던져 확인하기도 합니다.