[c언어] C 언어에서의 객체 지향적 설계 방법

C 언어는 주로 절차 지향적인 프로그래밍 언어로 알려져 있지만, 객체 지향적인 설계 원칙을 적용할 수도 있습니다. 객체 지향적인 설계는 코드의 구조를 더 모듈화하고 유지보수를 더 편리하게 할 수 있습니다. 이번 글에서는 C 언어에서 객체 지향 프로그래밍을 구현하는 방법에 대해 알아보겠습니다.

1. 구조체 활용

C 언어에서 객체를 표현할 때 가장 일반적으로 사용되는 방법은 구조체(struct)를 활용하는 것입니다. 구조체를 사용하여 데이터와 해당 데이터에 작용하는 함수를 묶어 하나의 모듈로 만들 수 있습니다. 이것이 C 언어에서의 객체 지향 설계의 핵심 아이디어입니다.

예를 들어, “사람”을 나타내는 객체를 만든다고 생각해봅시다. 이를 구조체로 표현할 수 있으며, 그 안에 “이름”, “나이”, “성별”과 같은 데이터 멤버들과 이들을 다루기 위한 함수들을 포함시킬 수 있습니다.

typedef struct {
    char name[50];
    int age;
    char gender;
    void (*set_name)(Person*, char*);
    void (*set_age)(Person*, int);
    void (*set_gender)(Person*, char);
} Person;

위 코드에서 Person 구조체는 이름, 나이, 성별을 나타내는 데이터 멤버들과 각각을 다루기 위한 함수 포인터들을 가지고 있습니다.

2. 함수 포인터 활용

C 언어에서는 함수도 포인터를 통해 사용될 수 있습니다. 따라서 구조체 내의 함수 포인터를 이용하여 해당 객체의 동작을 정의할 수 있습니다. 이러한 방식으로 객체의 행동을 정의함으로써, C 언어에서의 객체 지향적 설계를 구현할 수 있습니다.

void set_name(Person* person, char* new_name){
    strcpy(person->name, new_name);
}

void set_age(Person* person, int new_age){
    person->age = new_age;
}

void set_gender(Person* person, char new_gender){
    person->gender = new_gender;
}

int main(){
    Person person;
    person.set_name = &set_name;
    person.set_age = &set_age;
    person.set_gender = &set_gender;

    // 객체 초기화
    person.set_name(&person, "John");
    person.set_age(&person, 30);
    person.set_gender(&person, 'M');

    return 0;
}

위의 코드에서 Person 구조체 내의 함수 포인터에 원하는 동작을 수행하는 함수들을 할당하고, main 함수에서 구조체를 생성하고 해당 함수들을 호출하여 객체를 조작하고 있습니다.

3. 상속 구현

상속은 객체 지향 프로그래밍에서 중요한 기능 중 하나입니다. C 언어에서도 구조체를 이용하여 상속을 모방할 수 있습니다. 부모 구조체를 포함하는 자식 구조체를 생성하여, 부모의 멤버와 메서드들을 상속받을 수 있습니다.

typedef struct {
    char name[50];
    int age;
    char gender;
} Person;

typedef struct {
    Person parent;
    char school[50];
} Student;

위 코드에서 Student 구조체는 Person 구조체를 포함하여 상속을 모방하고 있습니다. 따라서 Student 구조체는 name, age, gender 멤버들을 상속받으면서, school이라는 새로운 멤버를 추가로 가지고 있습니다.

이렇게 구조체를 사용하여 상속을 모방함으로써, C 언어에서도 객체 지향적 설계의 일부를 구현할 수 있습니다.

C 언어를 사용하여 객체 지향적인 설계를 구현하는 방법에 대해 알아보았습니다. 구조체를 활용하여 데이터와 함수를 하나로 묶음으로써, C 언어에서도 객체 지향적인 원리를 적용할 수 있습니다.

참고자료: