분류가 맞을지는 모르겠지만, 내 경우에는 분기가 필요한 케이스를 4가지 정도로 나눠서 다루고 있어. (뭐.. 더 있을 수도 있지)
1. 1~2개의 선택지에 확장이 불필요한 경우
2. 2개 이상10개 이하의 선택지거나 확장이 필요한 경우
3. 그냥 선택지가 졸라 많은경우 10 ~
4. 문자열이 선택지인 경우
1번의 경우는 대부분 true/false이거나, 자잘한 조건 체크라서, 삼항연산자나 if문으로 간단하게 처리 가능해
이런식으로..
bool bres = (flag == 1) ? true : false;
if(bres == true) { printf("그냥 예제\n");}
2번의 경우는 그냥 switch를 사용한다. 선택지를 추가하거나 제거하기도 쉽고 가독성이 꽤 좋으니까
switch(key)
{
case 1: 1번함수 break;
case 2: 2번함수 break;
default: 디폴트 함수
}
이런식으로 어느 케이스에 어디로 분기하는지를 확실하게 알 수가 있으니까, 쉽게 추적이 가능해.
다만 라벨 갯수가 너무 많아지면, 오히려 가독성이 떨어지고 동작이 오래걸린다는 문제도 있지 (그래봐야 순식간이다...)
3번의 경우는 내 주변에는 이것도 switch로 다루는 사람이 꽤 있어. 그런데 선택지가 천개 만개쯤 되면, 이런 식으로 다루기가 힘들어지게 된다.
여기서부터는 상황에 따라 요령이 조금 필요하게 되는데, 내 경우에는 대충 이런 식으로 짠다.
typedef struct
{
int ncondition;
int (*func)(int*);
}SELECT_T;
SELECT_T *select;
select = malloc(sizeof(SELECT_T) *1000000000);
init(); <- 여기서 func랑 ncondition에 적당한 값을 넣어놓고 ncondition에 따라 구조체를 qsort()함수로 정렬시켜둔다.
이렇게 해 놓고 실행할때 bsearch()로 찾아 쓰면 처음 init할때 비용이 꽤 드는 문제가 있지만,
적어도 실행 도중에 속도 때문에 버벅이는 일은 거의 없게 된다.
물론 항상 저런 형태를 유지하는 건 아니고, 선택지와 실행 함수의 특성에 따라 추가되거나 경량화 되는 형태의 몇가지의 바리에이션이 있어.
단점은 가독성이 떨어진다. -_-;; 리얼 이거 쓰다가 코드 왜 이렇게 복잡하게 짜냐고 항의 받은적도 있어... (포인터 혐오(?)하시는 분들 꽤 많아..)
4번의 경우에는 switch를 적용하기가 곤란해.
그래서 처음 이 문제를 만나면, 대부분 if~else로 해결을 보는 것 같아.
이런식으로..
if(strncmp("문자1",str,strlen(str)){expression...}
elseif(strncmp("문자2",str,strlen(str)){expression...}
...
문제는 역시 문자열의 비교는 비용이 크다는 거겠지 만약 그 문자열 갯수가 백만개쯤 되고, 시간제한이 짧아서 리얼 헬게이트가 열린다. (...)
내 경우에는 이건 3번의 방법을 그냥 그대로 이용해.
typedef struct
{
char *szcondition;
int (*func)(int*);
}SELECT_T;
구조체를 대략 이렇게 정의해 놓고 쓰면 된다. 이 상태로 구조체 배열에 대해서 이진검색을 하면, 대충 쓸만한 성능이 나오더라.
그런데 만약 비교할 문자열에 4~5개 쯤 되면, 이런 거창한(?) 방법쓰기가 꽤 민망해 지는 경우가 많지. 그러면 이렇게 한다.
char szText[5][20]{"문자열1","문자열2","문자열3","문자열4","문자열5"};
for(i=0;i<5;i++){
strncmp(szText[i],str,20);
}
if(i == 5){printf("error!!\n"); return -1;}
switch(i)
{
...
}
장점은 물론 끝내주는 가독성과 확장성 이다.
단점은 물론 모든 케이스를 비교하는 최악의 방법이라는 거겠지. 애초에 비교할 갯수가 얼마 되지 않으면 뭐를 쓰든 성능에 큰 차이가 없으니까 그냥 단순한거 쓰는거고.
여기까지 C에서 분기를 다루는 꼼수에 대해서 몇가지 살펴봤음.
칼라똥을 쌌구나
출근하기 귀찮아서 휴가씀
하긴 그렇겠네 둘이 속도차가 거의 없으면 가독성이 나은 쪽을 고르는게 낫겠지
뿌들뿌들
그럼 switch를 쓰지 않는다는 사람들은 대부분 이유가 속도차라는 것 뿐인가?
switch가 if else 에 비해서 속도가 떨어지지는 않을걸.. 특히 선택지 개수가 조금 많다면 더더욱 그렇고
그럼 도데체 무슨 이유로 switch를 쓰지 않는다는 거지..
선택지가 유의미하게 많으면 선택 빈도수 조사나 해야지 뭐
대체 누가 switch를 안쓴다는 건데;;
길어서읽지않았습니다