C언어에서 OOP 하기(1) - class
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코드를 짠 것이라고 유추할 수 있을 것이다.
Comments