✅ 목표 (Goal)

앞서 작성했던 예제를 함수 포인터 배열을 이용해서 간결하게 만들어 보자. (=조건문을 없애보자.)

✅ 함수 포인터 배열을 이용한 코딩

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#define print_func_name (printf("%s%s\\r\\n", __func__,"()"))

void zero()  { print_func_name; }
void one()   { print_func_name; }
void two()   { print_func_name; }
void three() { print_func_name; }
void four()  { print_func_name; }
void five()  { print_func_name; }
void six()   { print_func_name; }
void seven() { print_func_name; }
void eight() { print_func_name; }
void nine()  { print_func_name; }

int main() {
	char key = 0;

	int dummy = 0;
	printf("Enter a number between 0 to 9: ");
	dummy = scanf("%c", &key);

	#define MAX_FUNC_CNT (10)
	void (*fp_arr[MAX_FUNC_CNT])() = {
		zero, one, two, three, four, five, six, seven, eight, nine,
	};

	unsigned int index = (unsigned int)(key - 0x30);
	(*fp_arr[index])();

	return 0;
}

✅ 함수 포인터 배열을 이용하면, switch-case를 간결하게 만들수 있다.

좌측의 조건문이 우측과 같이 한줄의 코드로 대체되면서 조건문이 사라졌다.

코드가 매우 간결해졌다.

	switch (key) {
		case '0': zero(); break;
		case '1': one(); break;
		case '2': two(); break;
		case '3': three(); break;
		case '4': four(); break;
		case '5': five(); break;
		case '6': six(); break;
		case '7': seven(); break;
		case '8': eight(); break;
		case '9': nine(); break;
	}
(*fp_arr[key-0x30])();

✅ 이게 뭐? 어쩌라고?

조건문이 사라졌다.

조건문이 있었는데, 사라졌습니다.

이는 상당히 중요한 기법이므로 잘 익혀두기 바란다.

위와 같이 조건문이 명약관화한 경우

딱히 함수 포인터 배열의 장점을 느낄수 없을지도 모른다.