개념
가상 메소드 테이블(Virtual Method Table, 흔히 "vtable")은 객체지향 프로그래밍 언어에서 다형성을 구현하기 위한 런타임 데이터 구조이다. 클래스에 가상 함수(또는 메소드)가 선언될 경우, 컴파일러는 각 클래스에 대해 해당 가상 함수들의 실제 구현 주소를 저장하는 테이블을 생성한다. 객체가 생성될 때, 해당 객체의 내부에 이 테이블을 가리키는 포인터(vptr)가 포함되어, 가상 함수 호출 시 런타임에 올바른 구현을 동적으로 선택한다.
주요 특징
- 동적 바인딩: 함수 호출 시점에 실제 메소드 구현을 결정한다.
- 정적 구조: 테이블 자체는 프로그램 로드 시점에 하나씩 생성되며, 클래스 계층 구조에 따라 상속 관계를 반영한다.
- 오버헤드: 가상 함수 호출은 일반 함수 호출에 비해 추가적인 포인터 역참조가 필요하므로 약간의 실행 시간 비용이 발생한다.
구현 방식
- 테이블 생성: 각 클래스에 대해 고유한 vtable이 생성된다.
- vptr 삽입: 객체 인스턴스는 보통 첫 번째 멤버에 vptr를 저장한다.
- 함수 주소 저장: vtable은 순서가 정해진 함수 포인터 배열이며, 순서는 컴파일러가 정의한다(보통 선언 순서 또는 선언된 가상 함수의 순서).
- 상속 및 오버라이드: 파생 클래스는 기본 클래스의 vtable을 복사하고, 오버라이드된 메소드에 대해서는 해당 엔트리를 새로운 구현 주소로 교체한다.
역사 및 언어별 적용
- C++: 가장 널리 알려진 구현 방식이며, 표준에는 vtable 구조가 명시되어 있지는 않지만, 대부분의 컴파일러가 이 방식을 채택한다.
- Java: 가상 메소드 호출을 위한 메커니즘은 vtable과 유사하지만, JVM 내부에서 메소드 디스패치 테이블(Method Dispatch Table) 형태로 구현된다.
- C#: CLR은 가상 메소드 호출을 위해 메소드 테이블(Method Table)을 사용한다.
- Objective‑C: 메시지 전달(message passing) 메커니즘을 사용하며, vtable 대신 메소드 캐시가 동작한다.
관련 용어
- vptr: 객체가 가리키는 가상 메소드 테이블의 포인터.
- 다중 상속: 일부 언어(C++)에서는 다중 상속 시 클래스당 여러 개의 vtable이 존재할 수 있다.
- 런타임 타입 식별(RTTI): 가상 메소드 테이블과 함께 객체의 실제 타입을 식별하는 메커니즘으로 사용된다.
참고
가상 메소드 테이블은 객체지향 언어의 실행 효율성을 높이기 위한 핵심 기술이며, 런타임 다형성 구현에 필수적인 요소로 평가받는다. 해당 개념은 프로그래밍 언어 구현, 컴파일러 설계, 시스템 성능 분석 등에서 널리 논의된다.