13. C++ OOP 개념 이해하기 : 캡슐화, 상속성, 다형성

- C++의 OOP 개념 이해하기 : 캡슐화, 상속성, 다형성
- C++은 강력한 객체 지향 프로그래밍(OOP) 언어로, 모듈화 및 재사용 가능한 코드를 작성하는 데 큰 도움을 줍니다.
- OOP 캡슐화
- 캡슐화
: 데이터와 메서드를 하나의 단위로 묶는 방법입니다.
클래스 내부의 데이터 멤버를 private으로 선언하고, public 메서드를 통해 접근하도록 설계하여 데이터의 무결성을 유
지 합니다.
이렇게 하면 외부에서 객체의 내부 구조를 직접 변경할 수 없으므로 안정성이 높아집니다.
- 프렌드 함수
: 클래스의 비공개 멤버에 접근할 수 있는 특수한 함수로, 클래스 내부 구현에 직접 접근할 필요가 있을 때 유용합니다.
- 정적 멤버
: 클래스의 모든 객체가 공유하는 멤버입니다. 클래스 내에 선언되며 객체가 아닌 클래스 자체에 속합니다.
- 상수 멤버
: 변경할 수 없는 멤버로, 객체의 상태를 불변으로 유지해야 할 때 사용합니다.
- 예제:
class Rectangle {
private:
double width;
double height;
public:
static int objectCount;
const double PI = 3.14159;
void setWidth(double w) {
width = w;
}
void setHeight(double h) {
height = h;
}
double getArea() {
return width * height;
}
friend void printWidth(Rectangle r);
};
void printWidth(Rectangle r) {
cout << "Width of rectangle: " << r.width << endl;
}
int Rectangle::objectCount = 0;
- OOP 상속성
- 상속성
: 새로운 클래스가 기존 클래스의 속성과 메서드를 상속받아 사용하는 기능입니다.
이를 통해 코드 재사용성이 높아지고 클래스 간의 계층적 관계를 형성할 수 있습니다.
- 파생 클래스
: 기본 클래스에서 상속받은 클래스입니다.
- 멤버 함수 오버라이딩
: 파생 클래스에서 기본 클래스의 메서드를 재정의하는 것을 의미합니다.
- 다중 상속
: 하나의 클래스가 둘 이상의 클래스로부터 상속받는 것을 말합니다.
- 예제:
class Animal {
public:
virtual void eat() {
cout << "Eating..." << endl;
}
};
class Dog : public Animal {
public:
void eat() override {
cout << "Dog eating..." << endl;
}
void bark() {
cout << "Barking..." << endl;
}
};
class Robot {
public:
void recharge() {
cout << "Recharging..." << endl;
}
};
class RoboDog : public Dog, public Robot {
public:
void run() {
cout << "Running..." << endl;
}
};
- OOP 다형성
- 다형성
: 하나의 인터페이스로 여러 데이터 타입이나 메서드를 처리할 수 있게 하는 기능입니다.
주로 함수 오버로딩과 상속을 통해 구현됩니다.
다형성은 컴파일 시간 다형성과 런타임 다형성으로 나눌 수 있습니다.
- 가상 함수
: 런타임 다형성을 구현하는 데 사용됩니다.
- 추상 클래스
: 하나 이상의 순수 가상 함수를 포함하는 클래스입니다.
이 클래스는 직접 객체를 생성할 수 없으며, 이를 상속받는 파생 클래스에서 구현해야 합니다.
- 예제 :
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
class Square : public Shape {
public:
void draw() override {
cout << "Drawing Square" << endl;
}
};
void render(Shape* shape) {
shape->draw();
}