분류가 맞을지는 모르겠지만, 내 경우에는 분기가 필요한 케이스를 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에서 분기를 다루는 꼼수에 대해서 몇가지 살펴봤음.