C언어에서의 this 구현

this는 객체지향 언어에서 class instance 자신을 나타냅니다. 자기 자신이기 때문에 별도의 이름을 갖는 다는 것도 좀 이상하기 때문에 this라는 키워드는 정말 잘 정한 것 같습니다.

 

C언어 에서 this라는 것을 활용해서 사용해보도록 하겠습니다. 다음과 같은 main.c 코드가 있습니다. uart 드라이버 포인터를 얻어와 uart를 open하고 read, write, close하는 일을 절차적으로 진행하고 있습니다.

/* main.c */
void main(void)
{
	driver_t *uart = set_uart();
	char value;

	uart->open();
	uart->read(0, &value);
	uart->write(0, &value, 1);
	uart->close();
}
 

사용자의 입장에서는 사용하는 기능을 구현하는 객체의 이름을 알고 있어야 합니다. 따라서 여기서는 uart라고 명시했습니다.

 

uart의 header 파일입니다. driver_t라는 interface를 정의하고 본체 코드에서는 아마도 실제적인 기능을 구현할 것으로 보입니다.

/* header */
#ifndef _THIS_UART_H_
#define _THIS_UART_H_

typedef struct
{
	bool (*open)(void);
	bool (*close)(void);
	bool (*read)(uint32_t addr, uint8_t *value);
	bool (*write)(uint32_t addr, uint8_t *value, uint32_t len);
}driver_t;

extern driver_t *setup_uart(void);

#endif
 

이제 driver_t라는 interface를 구현하는 uart.c 본체(콘크리트) 코드입니다. 이 파일내 11번째 줄에서 this라고 선언했는데요, 그 이유는 파일내에서 모두 this가 무엇을 의미하는지 알기 때문에 this라는 변수명으로 정의해서 사용하고 있습니다.

 

그리고 중요한 포인트가 있습니다. 바로 static 선언입니다. C언어에서 static으로 선언하면 extern이 되지 않습니다. 따라서 여기의 this는 현재 파일 외에서는 호출 할 수가 없습니다.

 

이 말은 다른 파일에서도 동일한 변수명, 즉 this를 자체적으로 사용 할 수 있다는 얘기가 됩니다. 물론 다른 파일의 this는 이 파일의 this와는 완전 별도의 변수가 되겠지요.

/* uart.c */
static driver_t this =
{
	open,
	close,
	read,
	write
};

driver_t *setup_uart(void)
{
	return &this;
}

static bool open(void)
{
	//... implements
	
	return true;
}

static bool close(void)
{
	//... implements

	return true;
}

static bool read(uint32_t addr, uint8_t *value)
{
	//... implements

	return true;
}

static bool write(uint32_t addr, uint8_t *value, uint32_t len)
{
	//... implements

	return true;
}
 

이런식으로 this와 static을 적당히 사용하면 객체지향 언어들처럼 다형성을 어느정도 구현 할 수 있게됩니다.

오늘은 여기까지..

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

RTOS 없이 구현한 스케줄러  (0) 2023.12.09
State 패턴  (1) 2023.12.08
C언어로 만드는 Interface  (1) 2023.12.06
C언어로 객체 지향 Class 흉내내기  (0) 2023.12.06
자바의 Class와 C의 구조체  (2) 2023.11.23