C++에서 구조체와 클래스는 객체 지향 프로그래밍을 구현하는 데 사용됩니다. 순수 가상 함수는 클래스나 구조체의 멤버 함수 중에서 이 함수를 상속받는 파생 클래스에서 반드시 재정의해야 하는 함수입니다.
구조체와 클래스의 차이점
먼저, C++에서 구조체와 클래스의 차이점을 알아봅시다.
구조체(struct)는 C++에서 데이터를 유사 그룹화하는 데 사용됩니다. 그런데 C++에서 구조체는 멤버 변수와 함수를 포함하거나 상속할 수 있어 클래스와 유사한 기능을 가지고 있습니다.
클래스(class)는 구조체와 유사하게 데이터를 그룹화하는 용도로 사용되지만, 클래스는 접근 제어 지시자(private, public, protected)와 같은 다양한 기능을 포함할 수 있습니다.
순수 가상 함수
C++에서 다형성을 구현하기 위해 가상 함수(virtual function)를 사용할 수 있습니다. 그리고 파생 클래스에서 반드시 해당 함수를 재정의하도록 강제하고 싶은 경우에 순수 가상 함수(pure virtual function)를 사용합니다.
순수 가상 함수는 다음과 같이 선언합니다:
virtual void functionName() = 0;
여기서 = 0
은 해당 함수가 순수 가상 함수임을 나타냅니다.
구조체와 클래스에서의 순수 가상 함수 활용
구조체나 클래스의 멤버 함수로 순수 가상 함수를 선언하려면 클래스나 구조체를 추상 클래스로 만들어야 합니다. 추상 클래스는 하나 이상의 순수 가상 함수를 포함하고 있는 클래스이며, 이를 상속받은 파생 클래스에서 해당 함수를 반드시 구현해야 합니다.
아래는 구조체와 클래스에서의 순수 가상 함수의 활용 예시입니다.
class Animal {
public:
virtual void makeSound() = 0; // 순수 가상 함수
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "멍멍" << endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "야옹" << endl;
}
};
위 예시에서 Animal
클래스는 순수 가상 함수를 가지고 있기 때문에 이 클래스는 추상 클래스가 됩니다. 그리고 Dog
와 Cat
클래스에서는 각각 makeSound
함수를 재정의하여 동물의 울음 소리를 출력하고 있습니다.
순수 가상 함수는 객체 지향 프로그래밍에서 다형성을 구현하는 데 중요한 역할을 합니다. 클래스를 설계할 때 이러한 다형성을 고려하여 순수 가상 함수를 적절히 활용하는 것이 좋습니다.
결론
C++에서 구조체와 클래스 둘 다 순수 가상 함수를 사용할 수 있습니다. 순수 가상 함수를 사용하면 파생 클래스에서 해당 함수를 반드시 재정의하도록 강제할 수 있으며, 이는 객체 지향 프로그래밍에서 다형성을 구현하는 데 중요한 기능입니다.
참고 자료
- cplusplus.com
- Bjarne Stroustrup, “The C++ Programming Language”, 4th Edition, Addison-Wesley, 2013.