C언어로 만드는 Interface

Java 같은 객체지향 언어에서 객체지향, 디자인패턴, Interface을 빼놓고는 설명할게 별로 없습니다. 이중 Interface는 객체지향의 근간이 되는 패턴으로 Interface를 이용해 언제든지 교체 가능한 모듈 형태의 프로그래밍과 더불어 외부 프로그램을 적절하게 통제 할 수 있습니다.

 

이러한 Interface의 필요성에 대해서는 따로 설명하지 않겠습니다. 우리는 C언어로 Interface를 만들어 보겠습니다. 이번에 만들 Interface는 UART입니다.

 

UART는 MCU와 외부 Device간의 시리얼 통신으로 많이 사용됩니다. 예를 들면 MCU+GPS Module, MCU+RS232(PC)등에서 사용되며 Interface를 설명하기에 적합합니다.

 

아래 코드는 UART Interface의 원형입니다.

typedef struct
{
    InitFunction Init;
    OpenFunction Open;
    TxHandlerFunction TxHandler;
    RxHandlerFunctioin RxHandler;
    //....(필요 시 추가)
}UartInterface;
 

위의 UART Interface를 이용해서 GPS Device Interface를 만들어 보겠습니다.

가령 gps_uart.c 를 만들어 보겠습니다.

/* gps_uart.c */
void CreatGpsUart(UartInterface *uart)
{
  uart->Open = GpsUartOpen;
  uart->TxHandler = GpsTxHandler;
  uart->RxHandler = GpsRxHandler;
}

void GpsUartOpen()
{
  //To do
}

void GpsTxHandler()
{
  //To do
}

void GpsRxHandler()
{
  //To do
}
 

CreateGpsUart를 호출함으로서 UART Interface의 구현부(Implement)가 완성되게 됩니다.

다음은 PC와 통신 가능한 rs232_uart.c RS232 Interface를 다뤄보도록 하겠습니다.

/* rs232_uart.c */
CreatRs232Uart(UartInterface *uart)
{
  uart->Open = Rs232UartOpen;
  uart->TxHandler = Rs232TxHandler;
  uart->RxHandler = Rs232RxHandler;
}

void Rs232UartOpen()
{
  //To do
}

void Rs232TxHandler()
{
  //To do
}

void Rs232RxHandler()
{
  //To do
}
 

위의 두개 모두 같은 UART통신을 다루고 있으므로 우리는 하나의 UART Interface를 만들어 이와 연결시켜줌으로서 일관성있는 프로그램이 가능하도록 제한을 걸 수 있었습니다. 이것이 Interface 패턴의 중요한 역할입니다.

 

이제 이 두개의 Interface를 사용할 main.c 를 보도록 하겠습니다.

UartInteface gGpsUart;
UartInteface gRs232Uart;

void main(void)
{
    CreatGpsUart(&gGpsUart);
    CreatRs232Uart(&gRs232Uart);

    //...
}
 

이제 우리는 Interface UartInterface 통해 두가지 기능을 만들어 냈습니다.

즐거운 C 생활되세요.

'▶ C Application > 디자인 패턴' 카테고리의 다른 글

State 패턴  (1) 2023.12.08
C언어에서의 this 구현  (1) 2023.12.06
C언어로 객체 지향 Class 흉내내기  (0) 2023.12.06
자바의 Class와 C의 구조체  (2) 2023.11.23
typedef의 활용과 함수포인터  (0) 2023.11.23