▶ C Application/디자인 패턴

C언어로 만드는 Interface

좋은아침페스츄리 2023. 12. 6. 16:11

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 생활되세요.