첫번째로 typedef에 대해 먼저 살펴보겠습니다.
C언어에서 typedef 는 새로운 타입을 만드는 지시어입니다. bool 타입은 true, false를 가지고 있는 기본적인 타입인데, 아쉽게도 C언어 안에는 bool 타입이 없습니다. 다행히도 아래 코드와 같이 typedef를 통해 간단하게 bool타입을 만들 수 있습니다.
typedef enum
{
false = 0,
true = 1
}bool;
bool isRegistered;
isRegistered = false;
if(isRegistered == true)
{
printf("It is registered!");
}
좀 더 활용해 보겠습니다. 아래 예는 네자리 숫자를 네개로 분리하는 새로운 타입입니다.
typedef struct
{
u8 D0;
u8 D1;
u8 D2;
u8 D3;
}digit_t;
새로운 digit_t라는 타입을 만들었습니다. 그리고 다음과 같이 사용할 수 있습니다.
digit_t speed;
speed.D0 = 0;
speed.D1 = 0;
speed.D2 = 0;
speed.D3 = 0;
두번째, 함수 포인터는 함수를 가르키는 포인터입니다. 개념은 어렵지 않습니다. 어셈블리 코드는 명령어, 데이터와 분기로 이루어져 있고 함수는 쉽게 말해 분기라고 할 수 있으니 함수가 주소입니다. 주소라는 것은 그 주소를 가르키는 포인터도 존재할 수 있다는 것을 말합니다. 그럼 함수포인터 타입선언 예제를 보세요.
//Handle : return parameter
//getHandleFunc : 함수명
//instance : parameter 타입은 void 포인터형
typedef Handle (*getHandleFunc)(void* instance);
좀 헷갈릴지도 모르지만 자꾸 접하다 보면 익숙해 집니다. 위 예제에서 return parameter인 Handle은 C에서는 실제 존재하지 않는 타입입니다.
위에서 만든 타입으로 함수 포인터를 선언을하려면, 다음과 같이 하면 됩니다.
getHandleFunc getHandle;
여기서 getHandle은 단순한 포인터입니다. 실제 함수 어드레시를 할당을 해주지 않고 사용하면 에러가 발생합니다. 자바에서 null pointer 같은 에러가 발생할 것이다. 다음과 같이 할당(assign) 하면 됩다.
typedef Handle (*getHandleFunc)(void* instance);
getHandleFunc getHandle;
Handle getEventHandle(void* instance);
void main(void)
{
void *instance;
..
..
getHandle = getEventHandle; //assign
getHandle(instance); //실제로는 getEventHandle 실행
}
Handle getEventHandle(void* instance)
{
//실제구현...
}
이러한 방식을 왜 사용하는지는 앞으로 차차 이해하게 될 것입니다. 중요한 것은 typedef로 새로운 타입을 만들 수 있다는 것과 함수포인터도 typedef를 이용하면 Class 의 멤버 변수 비스므레한 것을 만들 수 있다는 것입니다.
이번 포스트는 매우 중요합니다. 앞으로 디자인 패턴을 적용하려면 typedef와 함수 포인터는 아무렇지도 않게 사용해야 하기 때문입니다.
감사합니다.
'▶ 이전글 > C Pattern' 카테고리의 다른 글
Observer 패턴 (0) | 2014.10.02 |
---|---|
State 패턴 (4) | 2014.10.02 |
C로 Class 억지로 만들기 (1) | 2014.10.02 |
자바의 객체와 C의 구조체 (0) | 2014.10.02 |
C 패턴을 시작하며 (0) | 2014.10.01 |