객체 지향 프로그래밍에서 가상 함수(Virtual Function)는 파생된 클래스에서 재정의할 수 있는 멤버 함수입니다. 기본 클래스와 동일한 구문을 사용하고, 호출되는 동안 파생된 클래스에서 변경되거나 "재정의"될 수 있기 때문에 "가상"이라고 합니다.
가상 함수(Virtual Function)는 일반적으로 해당 클래스의 요구 사항에 맞게 파생 클래스에서 수정할 수 있는 함수의 기본 구현을 제공하는 데 사용됩니다. 이렇게 하면 기본 클래스가 함수의 기본적인 구현을 제공할 수 있고 파생 클래스가 필요한 경우 더 특수화된 동작으로 해당 구현을 재정의할 수 있으므로 유연성과 코드 재사용이 가능합니다.
아래 예제는 C++에서 가상 함수의 예제입니다.
class Animal {
public:
virtual void makeNoise() {
std::cout << "Some generic animal noise" << std::endl;
}
};
class Cat : public Animal {
public:
void makeNoise() {
std::cout << "Meow" << std::endl;
}
};
int main() {
Animal* animal = new Animal();
animal->makeNoise(); // Outputs "Some generic animal noise"
Animal* cat = new Cat();
cat->makeNoise(); // Outputs "Meow"
return 0;
}
위 예에서 Animal 클래스에는 일반 동물 소음을 출력하도록 정의된 makeNoise라는 가상 함수가 있습니다. Cat 클래스는 Animal에서 파생되었으며 makeNoise 함수를 Cat 클래스 내부에서 다시금 재정의하여 고양이가 내는 소음을 출력합니다.
메인함수에서 Animal 개체에서 makeNoise 함수를 호출하면 고양이 울음 소리가 아닌 일반 동물 노이즈가 출력됩니다. 만약 Cat 개체에서 호출되면 Cat 클래스가 이 동작을 제공하도록 함수를 재정의했기 때문에 고양이가 내는 소음을 출력합니다.
다음은 가상 함수 테이블(Virtual Function Table)입니다. 이는 가상 메소드 테이블(Virtual method Table) 혹은 vtable이라고 불리기도 합니다. 가상 함수의 동적 디스패치를 지원하기 위해 일부 개체 지향 프로그래밍 언어(예: C++ 및 C#)에서 사용되는 메커니즘입니다.
가상 함수 테이블은 주어진 클래스에 대한 가상 함수 구현에 대한 포인터를 저장하는 데 사용되는 데이터 구조입니다. 객체에서 가상 함수가 호출되면 프로그램은 가상 함수 테이블에서 해당 객체의 함수 주소를 찾아 해당 주소로 이동하여 함수를 실행합니다.
아래 예제는 C++에서 가상 함수 테이블을 사용하는 예제입니다.
class Animal {
public:
virtual void makeNoise() {
std::cout << "Some generic animal noise" << std::endl;
}
};
class Cat : public Animal {
public:
void makeNoise() {
std::cout << "Meow" << std::endl;
}
};
int main() {
Animal* animal = new Animal();
animal->makeNoise(); // Outputs "Some generic animal noise"
Animal* cat = new Cat();
cat->makeNoise(); // Outputs "Meow"
return 0;
}
가상 함수와 같은 예제입니다. 위 예제에서 Animal 클래스에는 일반 동물 소음을 출력하도록 정의된 makeNoise라는 가상 함수가 있습니다. Cat 클래스는 Animal에서 파생되었으며 makeNoise 함수를 재정의하여 고양이가 내는 소음을 출력합니다.
Animal 개체에서 makeNoise 함수가 호출되면 프로그램은 가상 함수 테이블에서 Animal 클래스의 함수 주소를 찾고 해당 주소로 이동하여 함수를 실행합니다. 마찬가지로 Cat 개체에서 호출되면 프로그램은 가상 함수 테이블에서 Cat 클래스의 함수 주소를 조회하고 해당 주소로 이동하여 함수를 실행합니다.
이러한 방식으로 가상 함수 테이블을 통해 프로그램은 기본 클래스의 함수 구현에 바인딩되지 않고 가상 함수가 호출되는 개체의 유형에 따라 가상 함수를 동적으로 디스패치할 수 있습니다. 파생 클래스가 기본 클래스에서 상속된 가상 함수의 구현을 재정의할 수 있으므로 유연성과 코드 재사용이 가능합니다.
가상 함수(Virtual Function)와 가상 함수 테이블(Virtual Function Table)의 차이
가상 함수(Virtual Function)는 파생 클래스에서 재정의하거나 재정의 할 수 있는 클래스의 멤버 함수이며, 가상 함수 테이블(Virtual Function Table) (=가상 메소드 테이블(Virtual method Table) 혹은 vtable)은 주어진 클래스에 대해 가상 함수 구현에 대한 포인터를 저장하는 데 사용되는 데이터 구조입니다.
C++ 및 C#과 같은 객체 지향 프로그래밍 언어에서 가상 함수(Virtual Function)는 해당 클래스의 요구 사항에 맞게 파생 클래스에서 수정할 수 있는 함수의 기본 구현을 제공하는 데 사용됩니다. 가상 함수 테이블(Virtual Function Table)은 가상 함수의 동적 디스패치를 지원하는 데 사용되며, 이를 통해 프로그램은 호출되는 개체 유형을 기반으로 가상 함수의 올바른 구현 주소를 조회할 수 있습니다.
'공부 > C++' 카테고리의 다른 글
Static과 extern의 개념 및 차이 (0) | 2022.12.29 |
---|---|
Dynamic_cast 내부동작은 어떻게 되는가? (0) | 2022.12.23 |
Vector resize, reserve의 차이점 (0) | 2022.12.21 |
포인터(Pointer)와 참조자(Reference)의 차이 (1) | 2022.12.20 |
Vector push_back과 emplace_back의 차이 (0) | 2022.12.16 |