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 언어에서도 객체 지향적인 원리를 적용할 수 있습니다.
참고자료:
- http://www.tenouk.com/Module.htm
- https://www.geeksforgeeks.org/data-encapsulation-in-c/
- https://www.techopedia.com/definition/28127/object-oriented-programming-oop