1.6 switch case: case: case: ...

yeonseong Jo·2023년 4월 18일
0

SEB_BE_45

목록 보기
8/47
post-thumbnail

switch...

python의 switch?

주구장창 파이썬으로만 개발해 왔던 나는
switch에 대해 들어만 봤고 오늘 처음 보고 사용해 봤다.
우선 파이썬에선 왜 switch가 없을까 궁금해서 물어보았다.

GPT 답

나:
python에서는 왜 switch가 없을까??

GPT:
Python은 다른 언어와는 달리 switch 문장을 지원하지 않습니다. 이는 Python 설계자들이 switch 문장이 다른 언어에서 보다 적극적으로 사용되지 않고, 대부분 if-elif-else문으로 대체 가능하다고 판단했기 때문입니다.

Python에서는 if-elif-else 구문을 사용하여 다양한 조건에 따라 분기하는 것이 일반적입니다. 또한, 딕셔너리를 사용하여 switch와 유사한 기능을 구현할 수도 있습니다.


구글링 결과

파이썬 역사 상 switch를 구현하려는 시도는 있었습니다.
다만 switch를 어떤 방식으로 구현하는 게 가장 효과적일지 결정하는 것이 까다롭고, 무엇보다 인기가 없어서 결국
구현되지 못했습니다. 대신 파이썬 공식 문서는 if...elif를 권장합니다.

출처



switch vs array

switch에 대해 몰랐을 때 다른 사람들은 switch case로 푼 문제를 배열을 사용해서 푼 적이 있었다.
주어진 월에 몇일까지 있는지를 return하는 문제였는데,
나는 주어진 월이 2일 경우 28을 return하고,

Arrays의 contains를 활용, 주어진 월이 4,6,8,11의 배열에 존재하면 30을 return, 이외에 31을 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에는 상수'만' 가능한거 같다.



break가 왜..?

위의 코드에서는 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를 포함해서 설계한 거 같다.


GPT 답

나:
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 패배??

profile
뒤(back)끝(end)있는 개발자

0개의 댓글