[c언어] C 언어에서의 다형성 구현 방법

C 언어는 다형성(polymorphism)을 직접적으로 지원하지는 않지만, 포인터, 구조체, 함수 포인터 등을 이용하여 다형성을 구현할 수 있습니다.

1. 구조체를 활용한 다형성

구조체를 이용하여 다양한 형태의 데이터를 하나의 변수에 담을 수 있습니다.

예를 들어, 도형을 나타내는 구조체와 도형의 종류별로 다른 정보를 담는 구조체를 정의하고, 이를 활용하여 여러 형태의 도형을 저장하고 처리할 수 있습니다.

typedef struct {
    int x;
    int y;
} Point;

typedef struct {
    Point center;
    int radius;
} Circle;

typedef struct {
    Point p1;
    Point p2;
} Rectangle;

typedef struct {
    enum {CIRCLE, RECTANGLE} shape_type;
    union {
        Circle circle;
        Rectangle rectangle;
    };
} Shape;

void draw(Shape *shape) {
    if (shape->shape_type == CIRCLE) {
        // 원 그리기
    } else if (shape->shape_type == RECTANGLE) {
        // 사각형 그리기
    }
}

2. 함수 포인터를 이용한 다형성

함수 포인터를 사용하여 여러 함수를 하나의 포인터로 가리키고, 실행할 함수를 동적으로 결정할 수 있습니다. 이를 이용하여 동일한 인터페이스를 갖는 다른 동작을 하는 함수를 다형적으로 사용할 수 있습니다.

예를 들어, 다양한 형태의 도형을 그리는 함수를 다형성을 활용하여 구현할 수 있습니다.

void drawCircle(Shape *shape) {
    Circle *circle = &shape->circle;
    // 원 그리기
}

void drawRectangle(Shape *shape) {
    Rectangle *rectangle = &shape->rectangle;
    // 사각형 그리기
}

int main() {
    Shape circleShape = {CIRCLE, .circle = { {0, 0}, 5 }};
    Shape rectangleShape = {RECTANGLE, .rectangle = { {0, 0}, {10, 10} }};

    void (*drawFunc)(Shape*);
    drawFunc = drawCircle;
    (*drawFunc)(&circleShape);

    drawFunc = drawRectangle;
    (*drawFunc)(&rectangleShape);

    return 0;
}

C 언어에서는 객체지향적인 다형성을 직접적으로 지원하지는 않지만, 위의 방법을 통해 다형성을 구현할 수 있습니다.

이러한 접근 방식은 간단하면서도 유연한 다형성을 구현하는데 활용될 수 있습니다.

참고문헌: