1편에서는 OOP에 대해서 설명했고 이번 2편에서는 C에서의 OOP에 대해서 설명하겠다.
C는 절차 지향 언어로 설계되었기 때문에, 객체 지향 프로그래밍(OOP) 기능을 기본적으로 제공하지 않는다. 하지만 구조체와 함수 포인터를 활용하여 객체 지향 개념을 모방할 수 있다. C에서 OOP 스타일로 코드를 작성하려면, 클래스, 상속, 캡슐화 등의 주요 개념을 수작업으로 구현해야 한다.
C에서의 OOP 구현 방법
1. 클래스의 구현
2. 상속의 구현
3. 다형성의 구현
4. 캡슐화
클래스의 구현
- C에서 클래스는 구조체를 통해 구현할 수 있다. 구조체는 데이터를 저장할 수 있는 멤버들을 포함하므로, 객체의 속성을 표현하는 데 사용할 수 있다.
- 또한, 함수 포인터를 구조체에 포함해 객체의 동작을 정의할 수도 있다.
typedef struct Car {
int speed;
void (*drive)(struct Car*); // 함수 포인터로 메서드 정의
} Car;
void driveCar(Car* car) {
car->speed += 10;
printf("현재 속도는 : %d 입니다\n");
}
int main() {
Car myCar = { 0, driveCar };
myCar.drive(&myCar);
myCar.drive(&myCar);
return 0;
}
1. 구조체 정의(Car)
- Car라는 구조체는 객체의 속성과 메서드를 정의하는 데 사용되며, C에서 클래스와 같은 역할을 한다.
- void (*drive)(struct Car*) : drive라는 함수 포인터를 정의하고 메서드 역할을 한다.
2. 메서드 정의(driveCar)
- drvieCar() 함수는 Car 구조체의 포인터를 매개변수로 받습니다.
3. 객체 초기화 및 메서드 호출(main)
- myCar라는 Car 객체를 선언하고 초기화한다.
- myCar.drive(&myCar)를 호출함으로써 myCar 객체의 속도가 증가한다.
상속의 구현
- C에서는 직접적으로 지원하지 않지만, 구조체를 중첩하여 "의미론적 상속"의 형태로 구현할 수 있다.
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point base;
int radius;
} Circle;
int main() {
Circle c;
c.base.x = 1;
c.base.y = 2;
c.radius = 5;
printf("Circle center: (%d, %d), Radius: %d\n", c.base.x, c.base.y, c.radius);
return 0;
}
Circle 객체 C는 base 멤버를 통해 Point 구조체의 속성인 x, y에 접근한다.
다형성(Polymorphism)의 구현
- C에서는 다형성을 위해 주로 함수 포인터를 사용한다.
typedef struct {
void (*draw)();
} Shape;
void drawRectangle() {
printf("Drawing Rectangle\n");
}
void drawCircle() {
printf("Drawing Circle\n");
}
int main() {
Shape rect;
rect.draw = drawRectangle;
Shape circ;
circ.draw = drawCircle;
// 다형성 사용
rect.draw();
circ.draw();
return 0;
}
1. 구조체 정의(Shape)
- void (*draw)();는 함수 포인터로 draw라는 메서드를 정의한다.
2. 객체 초기화 및 다형성 적용(main)
- Shape 타입의 객체 rect와 circ를 정의한다.
- rect의 draw는 drawRectangle 함수로 설정된다.
- circ의 draw는 drawCicle 함수로 설정된다.
- rect.draw()와 circ.draw()를 호출하면 각각 다른 함수가 실행된다.
이 코드에서의 핵심은 함수 포인터를 사용하여 동적 바인딩을 구현하는 것이다. 객체 지향 언어에서는 다형성을 통해 부모 클래스의 메서드를 자식 클래스들이 서로 다르게 구현하고 호출할 수 있다.
캡슐화(Encapsulation)
- 객체 지향에서는 데이터의 무분별한 접근을 막고, 데이터의 일관성을 유지하는 중요한 개념이다.
typedef struct {
int width;
int height;
} Rectangle;
// 접근 제어 함수
void setWidth(Rectangle* rect, int width) {
if (width > 0) {
rect->width = width;
}
}
int getWidth(Rectangle* rect) {
return rect->width;
}
1. 접근 제어 함수(setWidth, getWidth)
- setWidth 함수는 Rectangle 구조체의 width를 설정하는 함수이다.
- 이처럼 멤버 변수의 값을 설정할 때 유효성 검사를 수행하여 데이터의 일관성을 유지하는 것은 캡슐화의 중요한 부분이다.
- getWidth 함수는 Rectangle 구조체의 width 값을 반환하는 함수이다.
- 외부에서 width 멤버에 직접 접근하는 대신, 이 함수 getWidth를 통해 간접적으로 값을 가져오도록 한다.
728x90
'C언어' 카테고리의 다른 글
[C언어] qsort() 함수란? (0) | 2024.11.18 |
---|---|
srand() 함수란? (0) | 2024.11.15 |
티스토리 기본모드 수식 삽입 (2) | 2024.11.13 |
[C언어] OOP 공부 (1) (0) | 2024.11.12 |
[C언어] strcmp() 함수 (1) | 2024.11.07 |