이 방법은 사람들 뻔히 다 아는 고전적인 방법인데... 혹시 모르는 사람들은 꼭 볼 것!!!!

함수 포인터 배열과 enum (혹은 #define), char *message[] = {..., ..., ..., ...}; 이것들 엄청 유용함.

예제에서는 if 를 4개만 썼는데, if 가 수십개 넘어가면 아래 방법을 써보삼. 속도도 빠름.

아래를 보삼~~~~~~


#include <stdio.h> #include <string.h> /************ example 1 ************/ enum { STATE0, STATE1, STATE2, STATE3 }; void example1 () { int state = 3; if (state == STATE0) puts ("state0"); else if (state == STATE1) puts ("state1"); else if (state == STATE2) puts ("state2"); else if (state == STATE3) puts ("state3"); } /************ example 2 ************/ /* example1 에서 보던 if .. 다음 부분을 아래처럼 함수로 만들었습니다. * if .. 갯수 만큼 함수가 만들어지겠죠? */ void state0 () { puts ("FUNC_CALL[0]"); } void state1 () { puts ("FUNC_CALL[1]"); } void state2 () { puts ("FUNC_CALL[2]"); } void state3 () { puts ("FUNC_CALL[3]"); } /* 함수 포인터 배열 */ static void (* FUNC_CALL[4]) () = { state0, state1, state2, state3 }; void example2 () { int state = 3; /* example1 에서 보던 장문의 if .. else 문은 아래처럼 간략해 집니다. */ FUNC_CALL[state] (); } /************ example 3 ************/ void example3 () { const char *str = "state3"; if (!strcmp (str, "state0")) puts ("state0"); else if (!strcmp (str, "state1")) puts ("state1"); else if (!strcmp (str, "state2")) puts ("state2"); else if (!strcmp (str, "state3")) puts ("state3"); } /************ example 4 ************/ enum { STATE_MSG_0 = 0, STATE_MSG_1, STATE_MSG_2, STATE_MSG_3 }; const char *message[] = { "state-msg-0", "state-msg-1", "state-msg-2", "state-msg-3" }; void example4 () { int state_msg = STATE_MSG_3; /* example3 에서 보던 장문의 if strcmp() ... 문은 아래처럼 간략해 집니다. * strcmp() 를 사용하지 않고 한방에 끝내버리네요 ㅋㅋ */ puts (message[state_msg]); } /* example1 에서 example4 까지 방법을 상황에 맞게 적절히 구사하여 strcmp() 연산을 없앤다거나, * 장문의 if .. else if 또는 장문의 switch .. case .. case 문을 없앨 수 있습니다. * 상태 머신 제작에 유용하게 사용될 수 있으며, 이게 일종의 해시 함수라 볼 수 있으며, * 또한 에러 메시지 출력이나 다국어 메시지 카탈로그 처리에 활용하기 좋습니다. */ int main (int argc, char **argv) { example1 (); example2 (); example3 (); example4 (); return 0; }