unit 69. 함수 포인터 활용하기
, 신 지민님이 작성69.5 typedef로 함수 포인터 별칭 정의하기
p.982를 보면 typedef int (*FP)(int, int); 가 있습니다.
typedef의 사용법을 잘 모르겠습니다. typedef는 자료형을 재정의할 때 사용하는 것으로, 만약 typedef a b; 가 뜻하는 바는 a를 b로 정의한다 즉, a == b다. 맞을까요?
p.982에서 typedef int(*FP)(int, int); 정의 후 FP getAdd() 이런식으로 어떻게 사용이 가능한 지 궁금합니다.
Re: unit 69. 함수 포인터 활용하기
, 도장_ 관리자님이 작성typedef a b;
a를 b로 정의한다.
이게 기본입니다.
다만, 함수 포인터를 정의할 때 이렇게 할 수 없기 때문에 규칙을 정해둔 겁니다.
typedef 반환값자료형 (*함수포인터별칭)(매개변수자료형1, 매개변수자료형2);
이런 규칙을 정한 것이니 그냥 외워서 쓰는 겁니다.
int func(int, int)에 대한 함수 포인터를 정의하고 싶다면
int (*func_pointer)(int, int);
이렇게 정의하고 별칭은 func_pointer가 됩니다.(앞에 typedef 추가하면... 지금은 형식의 차이만 보여주려고 생략)
int func(int ,int)이지만 func라는 이름은 중요하지 않습니다. 그냥 이런 유형의 함수에 대한 함수 포인터를 선언한 겁니다.
int add(int, int) 함수도 func_pointer로 받을 수 있고,
int minus(int, int) 함수로 func_pointer로 받을 수 있습니다.
typedef 반환값자료형 (*함수포인터별칭)(매개변수);
이게 기본 형태이고, 이건 그냥 외워야 합니다. 문법이니까요.
매개변수는 0개, 1개, 2개... 어떤 형태든 정의하면 됩니다.
typedef int *func_pointer(int, int);
이렇게 쓰기로 했다면 함수 포인터 정의인지 C 언어 컴파일러가 구분할 수 있을까요?
전통적인
typedef a, b;
라면 a를 b로 정의하는 것이니
int를 앞으로 *func_pointer(int, int)로 정의한다.
이렇게 되겠죠?
int a;
라고 선언하면 이건
*func_pointer(int, int) a;
이런 형식은 없으니까 에러가 발생하겠지요?
typedef int *func_pointer(int, int);
이건 int가 아니라 int*를 재정의한 것이다!
int*을 func_pointer(int, int)로 정의한다! 라고 해석한다면요?
int* a;
라고 쓰면
func_pointer(int, int) a;
라는 형태가 되겠네요?
이것도 엉터리 문법이죠.
함수 이름 앞에 *를 붙이고 괄호 ( )로 묶어서 함수 포인터를 재정의한다.
이런 규칙을 만들어둔 것이니 외워서 써야 합니다.
1 더하기 1은 2다.
1+1 = 2
이게 왜 1+1은 2가 되나요? 11이 될 수 없나요? 3이 될 수 없나요? 유치원생이 종종 하는 질문이지만,
우리는 규칙으로 외우고 끝냅니다. 상상력이 부족한 어른으로 성장하는 과정 같기도 하네요.
영문법 가정법이 이해가 안 되는데요? 그냥 외워야죠. 함수 포인터 정의도 마찬가지입니다.
새로운 키워드를 C 언어에 추가하지 않고 기존 키워드에서 맥락에 따라 이렇게 해석합니다라는 문법으로 정한 사항입니다.