typedef의 활용 함수포인터

첫번째로 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 parameterHandle은 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