C++ 클래스 상속과 다형성 활용법
객체지향 프로그래밍(OOP)에서 상속(Inheritance)과 다형성(Polymorphism)은 핵심 개념입니다.
C++에서는 클래스를 기반으로 코드 재사용성과 확장성을 높이고, 다양한 객체를 공통 인터페이스로 처리할 수 있습니다.
이번 글에서는 C++에서 상속을 구현하는 방법과 가상 함수, 함수 오버라이딩, 추상 클래스 활용법까지 실전 예제와 함께 설명합니다.
1. 상속 기본
C++에서 상속은 부모 클래스(기반 클래스)의 멤버를 자식 클래스(파생 클래스)에서 재사용하고 확장할 때 사용합니다.
기본 문법은 다음과 같습니다.
#include <iostream>
using namespace std;
class Animal {
public:
void Eat() { cout << "먹는다" << endl; }
};
class Dog : public Animal { // Animal을 public 상속
public:
void Bark() { cout << "짖는다" << endl; }
};
int main() {
Dog d;
d.Eat(); // 부모 클래스 함수 사용
d.Bark(); // 자식 클래스 함수 사용
}
상속 종류에 따라 접근 범위가 달라집니다.
- public 상속: 부모 public 멤버가 자식 public으로, protected는 그대로 protected
- protected 상속: 부모 public/protected 모두 자식 protected
- private 상속: 부모 public/protected 모두 자식 private
2. 다형성과 가상 함수
다형성은 동일한 인터페이스로 여러 객체를 다르게 동작하도록 하는 특징입니다.
이를 위해 C++에서는 가상 함수(virtual function)를 사용합니다.
class Animal {
public:
virtual void Speak() { cout << "동물이 소리낸다" << endl; }
};
class Dog : public Animal {
public:
void Speak() override { cout << "멍멍" << endl; }
};
int main() {
Animal* a = new Dog();
a->Speak(); // 멍멍 출력, 다형성 적용
delete a;
}
override 키워드를 사용하면 부모의 가상 함수를 명시적으로 재정의할 수 있으며,
실수로 함수 시그니처가 다를 때 컴파일러가 오류를 알려 안전합니다.
3. 추상 클래스와 순수 가상 함수
추상 클래스(Abstract Class)는 하나 이상의 순수 가상 함수(pure virtual function)를 포함하는 클래스입니다.
순수 가상 함수는 `=0`으로 선언하며, 자식 클래스에서 반드시 구현해야 합니다.
class Shape {
public:
virtual void Draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void Draw() override { cout << "원 그리기" << endl; }
};
int main() {
Shape* s = new Circle();
s->Draw(); // 원 그리기 출력
delete s;
}
추상 클래스를 사용하면, 공통 인터페이스를 정의하고 다양한 파생 클래스에서 구체 구현을 강제할 수 있어 유지보수성이 높아집니다.
4. 주의사항
- 가상 함수를 사용하는 클래스는 가상 소멸자(virtual destructor) 필요: 부모 포인터로 삭제 시 메모리 누수 방지
- 다중 상속 시 이름 충돌과 다이아몬드 문제 주의
- 상속 깊이가 깊어지면 유지보수 어려움 → 적절한 설계 필요
- override와 final 키워드 활용: 안전한 오버라이딩과 상속 제한 가능
마무리
이번 글에서는 C++의 클래스 상속과 다형성을 다뤘습니다.
상속을 통해 코드 재사용성을 높이고, 가상 함수를 통해 다형성을 구현할 수 있으며,
추상 클래스는 공통 인터페이스를 정의하는 데 활용됩니다.
하지만 가상 소멸자, 다중 상속 문제, 설계 깊이 등 주의사항을 반드시 고려해야 합니다.
객체지향 설계를 이해하고 올바르게 활용하면, 확장성과 유지보수성이 뛰어난 코드를 작성할 수 있습니다.
'c++' 카테고리의 다른 글
C++ 컴파일 과정과 빌드 최적화 팁 (0) | 2025.09.21 |
---|---|
C++ 추상 클래스와 인터페이스 활용법 (0) | 2025.09.21 |
C++ 연산자 오버로딩 사용법 (0) | 2025.09.21 |
[C++ STL 시리즈] 6편: unordered_set과 unordered_map 사용법 (0) | 2025.09.20 |
[C++ STL 시리즈] 5편: set과 map 사용법 (0) | 2025.09.20 |