가상 함수(virtual function): 두 판 사이의 차이
(컴퓨터 과학 용어 정리 - 가상 함수(virtual function) 추가) |
편집 요약 없음 |
||
1번째 줄: | 1번째 줄: | ||
==== 가상 함수( | ==== 가상 함수(Virtual Function) ==== | ||
- | 가상 함수는 C++에서 '''실행 시간 다형성(Run-time Polymorphism)'''을 구현하기 위한 기능이다. 이 기능은 부모 클래스에서 정의하고, 자식 클래스에서 재정의(오버라이딩)하는 멤버 함수에 적용된다. | ||
가상 함수는 함수 선언 앞에 virtual 키워드를 붙여 선언하며, 프로그램 실행 중 실제 객체의 타입에 따라 호출할 함수를 결정하게 해준다. | |||
=== 특징 및 규칙 === | |||
클래스의 '''public''' 영역에서 선언해야 한다. | |||
가상 함수는 '''static'''으로 선언할 수 없다. | |||
다형성을 위해서는 '''기본 클래스의 포인터 또는 참조'''를 통해 가상 함수를 호출해야 한다. | |||
class | |||
public : | 자식 클래스에서 재정의할 경우, '''반환형과 매개변수'''는 부모 클래스와 일치해야 한다. | ||
=== 예제 코드 === | |||
#include | |||
using namespace std; | |||
class Parent { | |||
public: | |||
virtual void v_print() { | |||
cout << "Parent" << "\n"; | |||
} | |||
void print() { | |||
cout << "Parent" << "\n"; | |||
} | |||
}; | }; | ||
class | class Child : public Parent { | ||
public : | public: | ||
void v_print() override { | |||
cout << "Child" << "\n"; | |||
} | |||
void print() { | |||
cout << "Child" << "\n"; | |||
} | |||
}; | }; | ||
int main() { | int main() { | ||
Parent* p; | |||
Child c; | |||
p = &c; | |||
p->v_print(); // 가상 함수 → 자식 클래스의 함수가 호출됨 | |||
p->print(); // 일반 함수 → 부모 클래스의 함수가 호출됨 | |||
return 0; | |||
} | } | ||
=== 실행 결과 === | |||
=== 설명 === | |||
p는 Parent 타입의 포인터이지만 실제로는 Child 객체를 가리킨다. | |||
v_print()는 가상 함수이므로 실행 중 객체 타입을 기준으로 자식 클래스의 함수가 호출된다. → '''동적 바인딩''' 또는 '''후기 바인딩''' | |||
print()는 일반 함수이므로 컴파일 시간에 결정되어 부모 클래스의 함수가 호출된다. → '''정적 바인딩''' 또는 '''전기 바인딩''' | |||
=== 요약 === | |||
가상 함수는 C++에서 다형성을 실현하는 데 사용된다. | |||
부모 클래스의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체가 자식 클래스라면 자식 클래스의 함수가 실행된다. | |||
가상 함수를 사용하면 동일한 인터페이스로 다양한 동작을 구현할 수 있어 유지보수성과 확장성이 높아진다. |
2025년 5월 6일 (화) 06:57 기준 최신판
가상 함수(Virtual Function)
가상 함수는 C++에서 실행 시간 다형성(Run-time Polymorphism)을 구현하기 위한 기능이다. 이 기능은 부모 클래스에서 정의하고, 자식 클래스에서 재정의(오버라이딩)하는 멤버 함수에 적용된다.
가상 함수는 함수 선언 앞에 virtual 키워드를 붙여 선언하며, 프로그램 실행 중 실제 객체의 타입에 따라 호출할 함수를 결정하게 해준다.
특징 및 규칙
클래스의 public 영역에서 선언해야 한다.
가상 함수는 static으로 선언할 수 없다.
다형성을 위해서는 기본 클래스의 포인터 또는 참조를 통해 가상 함수를 호출해야 한다.
자식 클래스에서 재정의할 경우, 반환형과 매개변수는 부모 클래스와 일치해야 한다.
예제 코드
- 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++에서 다형성을 실현하는 데 사용된다.
부모 클래스의 포인터 또는 참조를 통해 가상 함수를 호출할 때, 실제 객체가 자식 클래스라면 자식 클래스의 함수가 실행된다.
가상 함수를 사용하면 동일한 인터페이스로 다양한 동작을 구현할 수 있어 유지보수성과 확장성이 높아진다.