대부분의 프로그래밍 언어의 문법은 닮아 있다.
파이썬 역시 C언어라는 뿌리로 부터 시작되었지만 switch/case 문이 없다.
왜? 없는지 궁금할 수 있겠으나 왜? 라는 질문에 대한 절대적인 해답은 없다고 본다.
굳이 답을 내자면 if~ elif문의 가독성이 워낙 좋고 switch/case문의 역할을 100% 할 수 있기 때문이라고 본다. 또한 사전(dictionary)라는 자료형을 사용하여 switch/case 문을 비슷하게 흉내낼 수도 있고 이것은 다른 언어의 switch/case 문 보다 더 간결하다.
고로 단순함을 추구하는 철학을 가진 파이썬 입장에서는 굳이 switch/case문을 채용할 필요가 없었다고 생각든다.
태어나서 파이썬 외에 다른 언어를 공부해보지 않았다면 switch/case문을 모를 테니 if~ else 문과 간단히 비교를 해보겠다.
a의 값이 0이면 "영"을 출력, a의 값이 1이면 "일"을 출력, a가 2면 "이"를 출력, 그 밖의 값이면 "default"를 출력 하는 코드다. 결과는 왼쪽 창(파이썬 쉘)에 "이"가 출력되었다.
만약 파이썬에 switch/case문이 있다면 위 코드와 같은 의미를 가진 코드는 다음과 같은 형태가 될 것이다.
(주의 : 위 코드를 실행시키면 동작할 리가 없고 syntax error가 난다.)
break 문의 목적은 switch/case문을 탈출 하기 위함이다. if문과 달리 switch/case문은 조건에 맞는 부분이 있더라도 해당 부분을 실행한 후 다음 case 문을 계속 실행한다. 따라서 if문과 동일하게 동작하게 하려면 break문을 일일히 써줘야 한다. 물론 의도적으로 break문을 쓰지 않는 경우도 있으나 여기에서는 논외로 한다.
그리고 코드의 가독성을 따져보면 if ~else문과 switch/case 문의 차이가 별로 없다. 오히려 break 명령어의 존재로 switch/case문의 코드가 더 길어진다.
사전을 사용한 switch 함수
case가 100가지가 넘는 다면 어떻게 할까? if ~ elif문으로 100가지 경우를 모두 나열해야 하는 것 파이썬 다운 코딩이 아니다. 이런 경우에는 사전을 사용한 switch 함수를 만들어 사용하는 테크닉이 도움이 된다.
switch 함수에 a를 넣으면 a에 값에 따라서 선택적으로 출력되는 값은 앞서 if ~ elif 문과 동일하다. 사전(dictionary)의 get 메소드는 두 개의 인자를 받는다.
첫 번째 인자를 키(key)로 하는 값을 반환해주며 만약 해당 key가 존재하지 않으면 두 번째 인자를 반환한다.
사전의 항목이 100개가 되더라도 코드를 심플하게 작성할 수 있는 장점이 있다.
클래스를 이용한 switch
심심하면 분석해보도록 하자. getattr 함수와 람다 함수에 대한 이해가 필요하다.
이 방식을 사용하면 메소드에 전달되는 인수에 따라서 호출 메소드를 달리할 수 있다. 이러한 메소드를 디스패치 메소드라고 하며 이벤트 처리방식에서 dispatch라는 말을 자주 들을 수 있다.