가상 함수(virtual function): 두 판 사이의 차이

기술노트
(컴퓨터 과학 용어 정리 - 가상 함수(virtual function) 추가)
 
편집 요약 없음
 
1번째 줄: 1번째 줄:
==== 가상 함수(virtual function) ====
==== 가상 함수(Virtual Function) ====


---
가상 함수는 C++에서 '''실행 시간 다형성(Run-time Polymorphism)'''을 구현하기 위한 기능이다. 이 기능은 부모 클래스에서 정의하고, 자식 클래스에서 재정의(오버라이딩)하는 멤버 함수에 적용된다.


> C++에서 자식 클래스에서 재정의(오버라이딩)할 것으로 기대하는 멤버 함수를 의미함
가상 함수는 함수 선언 앞에 virtual 키워드를 붙여 선언하며, 프로그램 실행 중 실제 객체의 타입에 따라 호출할 함수를 결정하게 해준다.
>
> 멤버 함수 앞에 `virtual` 키워드를 사용하여 선언함 → 실행시간에 함수의 다형성을 구현할 때 사용


<br>
=== 특징 및 규칙 ===


##### 선언 규칙
클래스의 '''public''' 영역에서 선언해야 한다.


* 클래스의 public 영역에 선언해야 한다.
가상 함수는 '''static'''으로 선언할 수 없다.
* 가상 함수는 static일 수 없다.
* 실행시간 다형성을 얻기 위해, 기본 클래스의 포인터 또는 참조를 통해 접근해야 한다.
* 가상 함수는 반환형과 매개변수가 자식 클래스에서도 일치해야 한다.


<syntaxhighlight>c++
다형성을 위해서는 '''기본 클래스의 포인터 또는 참조'''를 통해 가상 함수를 호출해야 한다.
class parent {
 
public :
자식 클래스에서 재정의할 경우, '''반환형과 매개변수'''는 부모 클래스와 일치해야 한다.
    virtual void v_print() {
 
        cout << "parent" << "\n";
=== 예제 코드 ===
    }
 
    void print() {
#include
        cout << "parent" << "\n";
using namespace std;
    }
 
class Parent {
public:
virtual void v_print() {
cout << "Parent" << "\n";
}
void print() {
cout << "Parent" << "\n";
}
};
};
 
class child : public parent {
class Child : public Parent {
public :
public:
    void v_print() {
void v_print() override {
        cout << "child" << "\n";
cout << "Child" << "\n";
    }
}
    void print() {
void print() {
        cout << "child" << "\n";
cout << "Child" << "\n";
    }
}
};
};
 
int main() {
int main() {
    parent* p;
Parent* p;
    child c;
Child c;
    p = &c;
p = &c;
 
    p->v_print();
p->v_print(); // 가상 함수 → 자식 클래스의 함수가 호출됨
    p->print();
p->print();   // 일반 함수 → 부모 클래스의 함수가 호출됨
 
    return 0;
return 0;
 
}
}
// 출력 결과
// child
// parent
</syntaxhighlight>


parent 클래스를 가리키는 포인터 p를 선언하고 child 클래스의 객체 c를 선언한 상태


포인터 p가 c 객체를 가리키고 있음 (몸체는 parent 클래스지만, 현재 실제 객체는 child 클래스)
=== 실행 결과 ===
 
=== 설명 ===
 
p는 Parent 타입의 포인터이지만 실제로는 Child 객체를 가리킨다.
 
v_print()는 가상 함수이므로 실행 중 객체 타입을 기준으로 자식 클래스의 함수가 호출된다. → '''동적 바인딩''' 또는 '''후기 바인딩'''
 
print()는 일반 함수이므로 컴파일 시간에 결정되어 부모 클래스의 함수가 호출된다. → '''정적 바인딩''' 또는 '''전기 바인딩'''
 
=== 요약 ===


포인터 p를 활용해 `virtual`을 활용한 가상 함수인 `v_print()`와 오버라이딩된 함수 `print()`의 출력은 다르게 나오는 것을 확인할 수 있다.
가상 함수는 C++에서 다형성을 실현하는 데 사용된다.


> 가상 함수는 실행시간에 값이 결정됨 (후기 바인딩)
부모 클래스의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체가 자식 클래스라면 자식 클래스의 함수가 실행된다.


print()는 컴파일 시간에 이미 결정되어 parent가 호출되는 것으로 결정이 끝남
가상 함수를 사용하면 동일한 인터페이스로 다양한 동작을 구현할 수 있어 유지보수성과 확장성이 높아진다.

2025년 5월 6일 (화) 06:57 기준 최신판

가상 함수(Virtual Function)

가상 함수는 C++에서 실행 시간 다형성(Run-time Polymorphism)을 구현하기 위한 기능이다. 이 기능은 부모 클래스에서 정의하고, 자식 클래스에서 재정의(오버라이딩)하는 멤버 함수에 적용된다.

가상 함수는 함수 선언 앞에 virtual 키워드를 붙여 선언하며, 프로그램 실행 중 실제 객체의 타입에 따라 호출할 함수를 결정하게 해준다.

특징 및 규칙

클래스의 public 영역에서 선언해야 한다.

가상 함수는 static으로 선언할 수 없다.

다형성을 위해서는 기본 클래스의 포인터 또는 참조를 통해 가상 함수를 호출해야 한다.

자식 클래스에서 재정의할 경우, 반환형과 매개변수는 부모 클래스와 일치해야 한다.

예제 코드

  1. include

using namespace std;

class Parent { public: virtual void v_print() { cout << "Parent" << "\n"; } void print() { cout << "Parent" << "\n"; } };

class Child : public Parent { public: void v_print() override { cout << "Child" << "\n"; } void print() { cout << "Child" << "\n"; } };

int main() { Parent* p; Child c; p = &c;

p->v_print(); // 가상 함수 → 자식 클래스의 함수가 호출됨 p->print(); // 일반 함수 → 부모 클래스의 함수가 호출됨

return 0;

}


실행 결과

설명

p는 Parent 타입의 포인터이지만 실제로는 Child 객체를 가리킨다.

v_print()는 가상 함수이므로 실행 중 객체 타입을 기준으로 자식 클래스의 함수가 호출된다. → 동적 바인딩 또는 후기 바인딩

print()는 일반 함수이므로 컴파일 시간에 결정되어 부모 클래스의 함수가 호출된다. → 정적 바인딩 또는 전기 바인딩

요약

가상 함수는 C++에서 다형성을 실현하는 데 사용된다.

부모 클래스의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체가 자식 클래스라면 자식 클래스의 함수가 실행된다.

가상 함수를 사용하면 동일한 인터페이스로 다양한 동작을 구현할 수 있어 유지보수성과 확장성이 높아진다.