switch...
주구장창 파이썬으로만 개발해 왔던 나는
switch에 대해 들어만 봤고 오늘 처음 보고 사용해 봤다.
우선 파이썬에선 왜 switch가 없을까 궁금해서 물어보았다.
나:
python에서는 왜 switch가 없을까??GPT:
Python은 다른 언어와는 달리 switch 문장을 지원하지 않습니다. 이는 Python 설계자들이 switch 문장이 다른 언어에서 보다 적극적으로 사용되지 않고, 대부분 if-elif-else문으로 대체 가능하다고 판단했기 때문입니다.Python에서는 if-elif-else 구문을 사용하여 다양한 조건에 따라 분기하는 것이 일반적입니다. 또한, 딕셔너리를 사용하여 switch와 유사한 기능을 구현할 수도 있습니다.
파이썬 역사 상 switch를 구현하려는 시도는 있었습니다.
다만 switch를 어떤 방식으로 구현하는 게 가장 효과적일지 결정하는 것이 까다롭고, 무엇보다 인기가 없어서 결국
구현되지 못했습니다. 대신 파이썬 공식 문서는 if...elif를 권장합니다.
switch에 대해 몰랐을 때 다른 사람들은 switch case로 푼 문제를 배열을 사용해서 푼 적이 있었다.
주어진 월에 몇일까지 있는지를 return하는 문제였는데,
나는 주어진 월이 2일 경우 28을 return하고,
물론 과정상 배열을 배우기 전
// switch case 사용
public int daysInMonth(int month) {
if (month==2) return 28;
switch (month){
case 4: case 6: case 9: case 11:
return 30;
}
return 31;
}
// 배열 사용
public int daysInMonth(int month) {
int[] li = {4,6,9,11};
if (month==2) return 28;
else if (Arrays.asList(arr).contains(month)) return 30;
return 31;
}
아직까진 뭐 크게 차이나 보이지 않는다.
하지만, case가 많아진다면 가독성이 떨어질 수도
또한, case에는 상수'만' 가능한거 같다.
위의 코드에서는 return이 break 역할을 하기 때문에
break가 없지만, break를 꼭 넣어줘야 한다고 한다.
이때 당시 case에 해당하는 명령만 실행하면
switch를 빠져나올 거 같은데,
왜 break가 필요한지 이해가 안갔기 때문에
물어보았다.
결과를 먼저 말하자면 OR 연산을 하기 위해서인거 같다.
만약 내가 의문을 가진 것 처럼 case에 해당하는 명령만 실행 한다고 친다면,
public void daysInMonth(int monht){
int last_day = 31;
switch (month){
case 2:
last_day=28;
case 4:
last_day=30;
case 6:
last_day=30;
case 9:
last_day=30;
case 11:
last_day=30;
}
이렇게 짜일 것이다.
last_day=30;
이 명령어가 4번이나 반복되는데,
break가 적용된다면,
public void daysInMonth(int monht){
int last_day = 31;
switch (month){
case 2:
last_day=28;
break
case 4:
case 6:
case 9:
case 11:
last_day=30;
break
}
로 코드가 조금 간결해 질 수 있다.
만약 case 4, 6, 9, 11의 결과가 다 다르게 명령을 해야 한다면,
위 코드와 비슷하게 짜여지겠지만,
조건이 4 or 6 or 9 or 11라면, 아래 코드로 간결하게 짤 수 있기 때문에 switch 구문에서 break를 포함해서 설계한 거 같다.
나:
switch 문에 break가 필요한 이유를 설명해줘GPT:
switch 문은 조건식의 결과에 따라 여러 가지 경우를 처리하는 구문입니다. 하지만, switch 문은 기본적으로 각 case의 실행이 끝나면 다음 case를 실행합니다. 이때, 각 case의 실행이 끝나지 않으면 그 다음 case를 실행할 때 이전 case의 결과가 계속해서 적용되는 문제가 발생할 수 있습니다.이러한 문제를 해결하기 위해 switch 문에서는 각 case의 실행이 끝난 후, 다음 case를 실행하지 않도록 break 문을 사용합니다. break 문은 현재 실행 중인 블록을 끝내고, switch 문을 빠져나가게 됩니다.
...
이해를 시켜주는게 아니라 그냥 결과만 알려준다.
이후 더 자세하게 질문을 했는데,
break가 없을 때 case 이후 모든 case가 다 실행되는 방식을
"fall-through"라고 했고,
fall-thorough 방식에 대해 질문 해 보았다.
나:
switch 문법은 왜 fall-through 방식을 사용해?GPT:
switch문의 fall-through 방식은 초기의 어셈블리어나 C 언어와 같은 저수준 프로그래밍 언어에서 사용되었던 문법적인 특성이 유지되기 위해 사용되었습니다.어셈블리어와 C 언어에서는 switch문이 등장하기 전에도 goto문이나 break문 등으로 제어문의 실행 흐름을 제어할 수 있었지만, 이러한 제어문들은 코드의 가독성을 해치기 때문에, switch문이 등장하면서 case문의 실행이 끝나면 다음 case문으로 자동으로 이동하도록 만들어졌습니다.
따라서, switch문의 fall-through 방식은 초기 프로그래밍 언어의 문법적인 특성에 기인한 것입니다. 하지만, 이후에 switch문이 사용되는 다양한 프로그래밍 언어에서도 이러한 문법이 계속해서 유지되어 왔습니다.
그러나, fall-through 방식은 버그 발생의 원인이 되거나 코드의 복잡도를 높일 수 있는 요소이기 때문에, 가능하면 case문의 실행이 끝나면 명시적으로 break문을 추가하여 switch문의 실행 흐름을 제어하는 것이 좋습니다.
요약을 하자면 별 특별한 이유는 없는거 같다.
그냥 초기 switch문이 등장했을 때 저급언어의 문법적인 특성을
유지하기 위해서이다.
GPT로 인해 fact를 알았고,
구글링의 결과로 이해를 하게 되었다.
GPT 패배??