Computer/C, C++

C언어에서 클래스를 사용하는 방법

젊은 동네 2023. 7. 13. 23:36
728x90

이번에는 C언어에서 클래스를 사용하는 방법에 대해 알아보겠습니다.

 

클래스란 객체지향 프로그래밍에서 데이터와 함수를 하나의 단위로 묶어서 관리하는 개념입니다. C언어는 기본적으로 객체지향 언어가 아니기 때문에 클래스를 직접 정의할 수는 없습니다. 하지만 구조체와 함수 포인터를 이용하면 클래스와 비슷한 효과를 낼 수 있습니다. 예시를 통해 살펴보겠습니다.

 

예를 들어, 사람이라는 클래스를 만들고 싶다고 가정해봅시다. 사람은 이름, 나이, 성별과 같은 속성과 말하기, 걷기, 먹기와 같은 행동을 가지고 있습니다. 이를 C언어로 표현하려면 다음과 같이 구조체와 함수 포인터를 정의할 수 있습니다.

// 사람 구조체 정의
typedef struct person {
    char* name; // 이름
    int age; // 나이
    char gender; // 성별
    void (*speak)(struct person*); // 말하기 함수 포인터
    void (*walk)(struct person*); // 걷기 함수 포인터
    void (*eat)(struct person*); // 먹기 함수 포인터
} person;

// 말하기 함수 정의
void speak(person* p) {
    printf("%s: 안녕하세요, 저는 %s입니다.\n", p->name, p->name);
}

// 걷기 함수 정의
void walk(person* p) {
    printf("%s: 저는 걷고 있습니다.\n", p->name);
}

// 먹기 함수 정의
void eat(person* p) {
    printf("%s: 저는 맛있게 먹고 있습니다.\n", p->name);
}

 

이제 사람 구조체에 값을 할당하고 함수 포인터에 함수를 연결해주면 클래스와 비슷하게 사용할 수 있습니다.

// 사람 구조체에 값 할당
person kim = {"김철수", 20, 'M', speak, walk, eat};
person lee = {"이영희", 18, 'F', speak, walk, eat};

// 함수 포인터로 행동 수행
kim.speak(&kim); // 김철수: 안녕하세요, 저는 김철수입니다.
lee.walk(&lee); // 이영희: 저는 걷고 있습니다.
kim.eat(&kim); // 김철수: 저는 맛있게 먹고 있습니다.

 

이렇게 구조체와 함수 포인터를 이용하면 C언어에서도 클래스와 비슷한 기능을 구현할 수 있습니다. 다만, 이 방법은 상속이나 다형성과 같은 객체지향의 고급 기능을 지원하지 않으므로 한계가 있습니다. 그래도 C언어로도 객체지향적인 코드를 작성할 수 있다는 것을 알아두면 좋을 것 같습니다.

 

C언어에서 클래스를 사용하는 방법은 재미있고 도전적인 주제라고 생각합니다. C언어는 객체지향 언어가 아니므로 클래스를 직접 구현하는 것은 쉽지 않습니다. 하지만 구조체와 함수 포인터를 이용하면 클래스와 비슷한 효과를 낼 수 있으므로, C언어의 유연성과 확장성을 보여준다고 할 수 있습니다.

 

클래스의 장점은 다음과 같습니다.

  • C언어로도 객체지향적인 코드를 작성할 수 있으므로, 코드의 가독성과 재사용성을 높일 수 있습니다.
  • 구조체와 함수 포인터는 C언어의 기본 요소이므로, 별도의 라이브러리나 컴파일러가 필요하지 않습니다.
  • 클래스와 비슷한 기능을 구현하면서도 C언어의 특징과 장점을 유지할 수 있습니다.

 

단점은 다음과 같습니다.

  • 상속이나 다형성과 같은 객체지향의 고급 기능을 지원하지 않으므로, 복잡한 프로그램을 작성하기에는 한계가 있습니다.
  • 구조체와 함수 포인터를 이용하는 것은 클래스를 정의하는 것보다 번거롭고 오류가 발생하기 쉽습니다.
  • C언어는 객체지향 언어가 아니므로, 클래스를 사용하는 것이 적합하지 않을 수도 있습니다.