C언어에서 OOP 하기(1) - class

1 minute read

C는 절차지향 언어로 객체지향 언어에서 제공되는 class keyword가 존재하지 않는다.
하지만 class를 사용하지 않고도 class와 같은 기능을 하는 코드를 구현할 수 있다.

#include <stdio.h>

class MyClass
{
public:
	void setA(int num) { this->a = num; };
	void setB(int num) { this->b = num; };
	int sum() { return this->a + this->b; };
	int a, b;
};

int main(void)
{
	MyClass myClass;
	myClass.setA(1);
	myClass.setB(2);
	printf("%d", myClass.sum()); // Output: 3
	return 0;
}

위와 같은 c++코드를 c코드로 변환하면 아래와 같다.

#include <stdio.h>

typedef struct _MyClass
{
	int a, b;
} MyClass;

void setA(MyClass *self, int num) { self->a = num; };
void setB(MyClass *self, int num) { self->b = num; };
int sum(MyClass *self) { return self->a + self->b; };

int main(void)
{
	MyClass myClass;
	setA(&myClass, 1);
	setB(&myClass, 2);
	printf("%d", sum(&myClass)); // Output: 3
	return 0;
}

c++에서 myClass.setA(1)setA(&myClass, 1)처럼 변환하면 된다.
눈치가 좋은 사람은 c 코드의 self가 c++의 this처럼 사용되는 것을 깨달았을 것이다.
실제로 this 포인터는 myClass의 주소와 동일하다.

#include <stdio.h>

class MyClass
{
public:
	void printThis() { printf("%p\n", this); }
};

int main(void)
{
	MyClass myClass;
	printf("%p\n", &myClass); // Output: 00EFF9EF
	myClass.printThis(); // Output: 00EFF9EF
	return 0;
}

앞으로 c 코드를 보는데 함수들의 첫 파라미터가 특정 구조체의 포인터라면, 객체지향적인 c코드를 짠 것이라고 유추할 수 있을 것이다.

Categories:

Updated:

Comments