- void main()
- {
- int input;
- printf("입력 : ");
- scanf("%d", &input);
- switch(a)
- {
- case 1:
- printf("1번\n");
- break;
- case 2:
- printf("1번\n");
- break;
- case 3:
- printf("1번\n");
- break;
- case 4:
- printf("1번\n");
- break;
- }
- }
위와같은 코드는 유지보수에 있어서 문제가 상당히 큽니다.
case 부분의 실행부분이 커질수록 가독성이 급격히
하락합니다.
그래서 보통 어느정도 생각이 조금 박힌 사람은 다음과 같은 코드를 사용합니다.
- void func_one()
- {
- printf("1번\n");
- }
- void func_two()
- {
- printf("2번\n");
- }
- void func_three()
- {
- printf("3번\n");
- }
- void func_four()
- {
- printf("4번\n");
- }
- void main()
- {
- int input;
- printf("입력 : ");
- scanf("%d", &input);
- switch(a)
- {
- case 1:
- func_one();
- break;
- case 2:
- func_two();
- break;
- case 3:
- func_three();
- break;
- case 4:
- func_four();
- break;
- }
- }
프로그램의 구조화를 적용해서 그나마 조금 낫게 만들었네요..
하지만 switch-case 가 남아있어 case
의 몸통이 커질 가능성은 아직 남아있네요..
저 switch-case 를 어떻게 없앨 수 있는가..
여기서 사용할 수 있는게 "함수
포인터 배열" 입니다.
여기서 잠깐
함수 포인터란?
C/C++ 컴파일러는 소스코드를 컴파일할 때, 심벌테이블을
만듭니다(여기까진 다 아시져?)
이 심벌테이블에 들어가는건 변수의 주소 뿐 아니라 함수의 실행코드의 시작위치까지 저장이
되는데요,
(그 단적인 예로 사용자 정의 함수의 이름과 변수의 이름을 똑같이 쓰면 말도 안되는 동작이 가끔씩 나옵니다.)
(변수명 -
주소), (함수명-주소) 의 쌍으로 저장을 합니다. 이러한 특징 때문에 함수의 이름을 포인터처럼 사용할 수가 있는것이져..
말이 너무
길었네요 우선 함수포인터의 선언형태부터 보져
void(*func_ptr)();
와 같은 형식으로 선언합니다.
연산자
우선순위상 다음과 같은 선언을 하게되면
void *func_ptr();
void * 를 리턴하는 함수를 선언하는걸로 인식해서
컴파일러는 에러를 뱉어냅니다.
따라서 () 로 우선순위를 잡아주는거죠...
간단한 함수포인터 사용 예제입니다.
- void (*func_ptr)();
- void func_one()
- {
- printf("1번\n");
- }
- void main()
- {
- func_ptr = func_one;
- (*func_ptr)(); //func_one() 함수 실행
- }
위에서 말씀드린것 처럼 함수의 이름이 포인터로 사용되어 호출하는 모습입니다.
이걸 좀더 응용해서
switch-case 를 없애고 가독성을 확보해보도록 하겠습니다.
- void (*func_ptr[4])();
- void func_one()
- {
- printf("1번\n");
- }
- void func_two()
- {
- printf("2번\n");
- }
- void func_three()
- {
- printf("3번\n");
- }
- void func_four()
- {
- printf("4번\n");
- }
- void main()
- {
- int input;
- func_ptr[0] = func_one;
- func_ptr[1] = func_two;
- func_ptr[2] = func_three;
- func_ptr[3] = func_four;
- printf("입력 : ");
- scanf("%d", &input);
- (*func_ptr[input-1])();
- }
switch-case 가 사라져서 아주 깔끔한 형태가 되었네요
어때요? 참 쉽져? ㅋㅋㅋ
사족을
달자면, 현재 MFC 에서는 위와 같은 방법으로 메세지를 처리하고 있습니다.
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
Timer - getElapsedMilliSecond (0) | 2012.10.31 |
---|---|
C 언어에서 파일을 여는 함수 입니다. W/R 모드 (0) | 2012.10.31 |
GetAsyncKeyState (0) | 2012.10.31 |
GetPrivateProfileStringA (0) | 2012.10.31 |
forceinline VS inline (0) | 2012.10.31 |