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 |