C++에서 순수 가상 클래스(Pure Virtual Class)는 하나 이상의 순수 가상 함수를 포함하는 클래스로, 이 클래스를 직접 인스턴스화할 수 없습니다. 순수 가상 클래스는 주로 인터페이스를 정의하는 데 사용되며, 자식 클래스에서 해당 인터페이스를 구현하도록 강제합니다. 이 글에서는 순수 가상 클래스의 개념, 사용법, 예제, 그리고 주의사항에 대해 자세히 살펴보겠습니다.
1. 순수 가상 클래스란?
순수 가상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스로, 이러한 함수는 = 0
으로 선언됩니다. 순수 가상 클래스는 객체를 생성할 수 없으며, 자식 클래스에서 해당 함수를 반드시 구현해야 합니다. 이를 통해 특정 기능을 강제할 수 있습니다.
1.1 순수 가상 함수의 정의
순수 가상 함수는 다음과 같이 정의됩니다:
class Base {
public:
virtual void pureVirtualFunction() = 0; // 순수 가상 함수
};
이 경우, Base
클래스는 순수 가상 함수를 포함하고 있으며, 이 클래스를 상속받는 모든 자식 클래스는 pureVirtualFunction()
을 구현해야 합니다. 순수 가상 함수는 인터페이스의 일종으로, 자식 클래스가 반드시 구현해야 할 메서드를 정의합니다. 이를 통해 코드의 일관성을 유지하고, 다양한 객체가 동일한 방식으로 동작하도록 강제할 수 있습니다.
2. 순수 가상 클래스의 사용법
순수 가상 클래스를 사용하여 인터페이스를 정의하고, 이를 구현하는 자식 클래스를 생성할 수 있습니다. 자식 클래스는 부모 클래스의 순수 가상 함수를 반드시 구현해야 합니다.
2.1 기본 구조
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override { // 순수 가상 함수 구현
cout << "Drawing a Circle" << endl;
}
};
class Square : public Shape {
public:
void draw() override { // 순수 가상 함수 구현
cout << "Drawing a Square" << endl;
}
};
위의 예제에서 Shape
클래스는 순수 가상 함수 draw()
를 정의하고 있습니다. Circle
과 Square
클래스는 Shape
클래스를 상속받아 draw()
메서드를 구현합니다. 이 구조는 다양한 도형을 그리는 기능을 통합하여 관리할 수 있게 해줍니다. 즉, Shape
클래스는 도형의 기본적인 인터페이스를 제공하고, 각 도형 클래스는 그에 맞는 구체적인 구현을 제공합니다.
3. 예제: 순수 가상 클래스 구현
다음은 순수 가상 클래스를 사용하여 도형을 그리는 예제입니다.
#include <iostream>
using namespace std;
// 순수 가상 클래스
class Shape {
public:
virtual void draw() = 0; // 순수 가상 함수
};
class Circle : public Shape {
public:
void draw() override { // 순수 가상 함수 구현
cout << "Drawing a Circle" << endl;
}
};
class Square : public Shape {
public:
void draw() override { // 순수 가상 함수 구현
cout << "Drawing a Square" << endl;
}
};
int main() {
Shape* shape1 = new Circle(); // Circle 객체 생성
Shape* shape2 = new Square(); // Square 객체 생성
shape1->draw(); // Circle의 draw() 호출
shape2->draw(); // Square의 draw() 호출
delete shape1; // 메모리 해제
delete shape2; // 메모리 해제
return 0;
}
3.1 코드 설명
- Shape 클래스: 순수 가상 클래스이며,
draw()
메서드를 순수 가상 함수로 정의합니다. 이 클래스는 직접 인스턴스화할 수 없습니다. 즉,Shape
클래스의 객체를 생성하려고 하면 컴파일 오류가 발생합니다. - Circle 클래스:
Shape
클래스를 상속받아draw()
메서드를 구현합니다. 이 메서드는 원을 그리는 동작을 나타내며,Drawing a Circle
이라는 메시지를 출력합니다. - Square 클래스:
Shape
클래스를 상속받아draw()
메서드를 구현합니다. 이 메서드는 사각형을 그리는 동작을 나타내며,Drawing a Square
라는 메시지를 출력합니다. - main() 함수:
Shape
클래스의 포인터를 사용하여Circle
과Square
객체를 생성합니다. 이때, 부모 클래스의 포인터를 통해 자식 클래스의 메서드를 호출할 수 있습니다. 이는 다형성을 활용한 예로,shape1->draw()
는Circle
클래스의draw()
메서드를 호출하고,shape2->draw()
는Square
클래스의draw()
메서드를 호출합니다. 이렇게 함으로써, 다양한 도형을 동일한 방식으로 처리할 수 있습니다.
4. 주의사항
4.1 인스턴스화 금지
순수 가상 클래스는 직접 인스턴스화할 수 없습니다. 따라서, 순수 가상 클래스를 사용하여 객체를 생성하려고 하면 컴파일 오류가 발생합니다. 이는 순수 가상 클래스가 인터페이스의 역할을 하기 때문입니다.
4.2 자식 클래스의 구현 필수
자식 클래스는 부모 클래스의 모든 순수 가상 함수를 구현해야 합니다. 만약 자식 클래스에서 순수 가상 함수를 구현하지 않으면, 자식 클래스도 순수 가상 클래스가 되어 인스턴스화할 수 없습니다. 이는 코드의 일관성을 유지하는 데 중요합니다.
4.3 인터페이스의 역할
순수 가상 클래스는 인터페이스의 역할을 하며, 다양한 자식 클래스에서 공통된 기능을 정의하고 구현할 수 있도록 합니다. 이를 통해 코드의 일관성을 유지하고, 다양한 객체를 동일한 방식으로 처리할 수 있습니다. 예를 들어, Shape
클래스를 통해 모든 도형이 draw()
메서드를 구현하도록 강제함으로써, 도형을 그리는 코드가 일관되게 유지됩니다.
5. 결론
C++의 순수 가상 클래스는 인터페이스를 정의하는 데 중요한 역할을 합니다. 이를 통해 자식 클래스에서 특정 기능을 강제할 수 있으며, 다형성을 활용하여 다양한 객체를 동일한 방식으로 처리할 수 있습니다. 순수 가상 클래스를 사용할 때는 인스턴스화 금지, 자식 클래스의 구현 필수, 인터페이스의 역할에 주의하여 올바르게 구현하는 것이 중요합니다. 다음 포스팅에서는 상속에서 형변환을 사용하는 방법에 대해 다룰 예정입니다.
'C++ 프로그래밍' 카테고리의 다른 글
C++의 다중 상속: 유연성 vs 복잡성 (0) | 2025.02.09 |
---|---|
C++의 상속에서의 형변환: 업캐스팅과 다운캐스팅 (0) | 2025.02.09 |
C++의 가상 함수: 다형성의 핵심 (0) | 2025.02.08 |
C++ 상속에서의 생성자와 소멸자: 초기화와 자원 관리의 중요성 (0) | 2025.02.08 |
C++의 메서드 재정의: 객체 지향 프로그래밍의 유연성 (0) | 2025.02.08 |
댓글