virtual 키워드에 대해 자세히 설명해드리겠습니다.
virtual은 C++에서 동적 바인딩(런타임 다형성)을 구현하는 핵심 키워드입니다. 주요 특징과 사용 목적은 다음과 같습니다:
- 동적 바인딩 (Dynamic Binding)
- 프로그램 실행 중에 어떤 함수를 호출할지 결정
- 기본 클래스의 포인터나 참조로 파생 클래스의 함수를 호출 가능
- 가상 함수 테이블 (vtable)
- virtual 함수가 있는 클래스는 vtable을 가짐
- 객체마다 vptr(가상 함수 테이블을 가리키는 포인터)를 가짐
- 메모리와 성능에 약간의 오버헤드 발생
실제 예제를 통해 살펴보겠습니다:
이 예제에서 주목할 점들:
- virtual 소멸자
- 기본 클래스의 소멸자를 virtual로 선언하여 적절한 정리를 보장
- 메모리 누수 방지
- override 키워드
- 가상 함수를 오버라이드한다는 것을 명시적으로 표시
- 실수 방지와 코드 가독성 향상
- 순수 가상 함수 (pure virtual function)
- virtual void move() = 0;와 같이 선언
- 구현을 강제하며, 이를 포함한 클래스는 추상 클래스가 됨
- 동적 바인딩 vs 정적 바인딩
- virtual 함수 makeSound()는 동적 바인딩
- 일반 함수 eat()는 정적 바인딩
이러한 virtual 메커니즘을 통해 C++에서는 다형성을 효과적으로 구현할 수 있습니다. 하지만 virtual 함수는 약간의 성능 오버헤드가 있으므로, 필요한 경우에만 사용하는 것이 좋습니다.
# 오버라이딩
오버라이딩(Overriding)은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것을 말합니다. 구체적인 예제로 설명해드리겠습니다: