가상 함수와 vtable
가상 함수로 실행 시간 다형성을 구현하고 vtable 개념을 살펴봅니다.
가상 함수와 vtable은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
정적 바인딩과 동적 바인딩
기본적으로 멤버 호출은 정적으로 바인딩됩니다 — 컴파일러가 선언된 타입을 기준으로 함수를 선택합니다. virtual 함수에서는 실제 타입을 기준으로 호출이 동적으로 바인딩됩니다.
가상 함수 선언
base 클래스에서 함수에 virtual을 표시하십시오. derived 클래스는 이 함수를 재정의할 수 있습니다.
class Shape {
public:
virtual double area() const = 0; // pure virtual
virtual ~Shape() = default;
};
class Circle : public Shape {
double r_;
public:
Circle(double r) : r_(r) {}
double area() const override { return 3.14159 * r_ * r_; }
};override 지정자
derived 메서드에 override를 추가하십시오. 컴파일러가 해당 함수가 실제로 가상 함수를 재정의하는지 확인하므로 시그니처의 오타를 잡을 수 있습니다.
final 지정자
final은 추가 재정의를 방지합니다. 더 이상 상속할 수 없도록 해야 하는 클래스나 다시 재정의할 수 없도록 해야 하는 메서드에 사용하십시오.
class Concrete final : public Base { /* ... */ };
class Base {
virtual void f() final; // cannot be overridden
};base 포인터를 통한 호출
다형성의 핵심은 base 포인터가 올바른 derived 메서드로 호출을 전달할 수 있다는 것입니다.
Shape* s = new Circle(3.0);
std::cout << s->area(); // 28.27... (Circle::area)
delete s;가상 함수 테이블 개념
각 다형성 클래스에는 숨겨진 가상 함수 테이블이 있습니다 — 함수 포인터의 테이블입니다. 각 객체는 자신의 클래스 가상 함수 테이블을 가리키는 숨겨진 포인터를 보유합니다.
가상 호출의 비용
가상 호출은 가상 함수 테이블을 통한 간접 참조를 한 번 더 수행합니다. 대부분의 코드에서는 무시할 수 있는 수준입니다. 측정 결과 병목인 경우에만 내부 반복문에서 피하십시오.
순수 가상 함수
= 0을 추가하면 함수를 순수 가상으로 만들 수 있습니다. derived 클래스는 인스턴스를 생성할 수 있도록 이 함수를 재정의해야 합니다. 그러면 클래스는 추상 클래스가 됩니다.
가상 소멸자
클래스에 가상 함수가 하나라도 있거나 base 포인터를 통해 삭제할 예정이라면 가상 소멸자를 제공하십시오. 그렇지 않으면 derived 소멸자가 실행되지 않습니다.
class Base {
public:
virtual ~Base() = default; // safe to delete through Base*
};스마트 포인터를 사용한 다형성
다형성 객체는 base를 가리키는 스마트 포인터로 보관하십시오. 스마트 포인터가 올바른 소멸을 처리합니다.
std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);슬라이싱 다시 살펴보기
base를 인수로 예상하는 함수에 derived 객체를 값으로 전달하면 derived 부분이 잘려 나갑니다. 다형성 매개변수에는 참조나 포인터를 사용하십시오.
성능과 유연성의 절충
가상 함수는 약간의 실행 시간 비용으로 유연성을 제공합니다. 템플릿은 실행 시간 비용 없이 컴파일 시간 다형성을 제공하므로, 다형성이 실행 시간에 필요한지에 따라 선택하십시오.
빠른 확인
다형성 base 클래스에 virtual 소멸자가 있어야 하는 이유는 무엇인가요?
복습
가상 함수는 클래스별 가상 함수 테이블을 통해 실행 시간 다형성을 가능하게 합니다. 재정의에는 override를 표시하고, 추가 상속을 방지하려면 final을 사용하십시오. 다형성 base 클래스에는 항상 가상 소멸자를 제공하십시오.
자주 묻는 질문
“가상 함수와 vtable” 강의는 무료인가요?
네 — “가상 함수와 vtable” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“가상 함수와 vtable”에서 뭘 배우나요?
가상 함수로 실행 시간 다형성을 구현하고 vtable 개념을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“가상 함수와 vtable” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 단일 상속과 다중 상속
- 가상 함수와 vtable
- 추상 class와 순수 가상 메서드
- 상속과 컴포지션의 상충 관계