상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - C++에서 가상 함수란 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
C++에서 <a href='https://sangseek.com/sangseeks/가상 함수/ko'>가상 함수</a>(Virtual Function)는 객체 지향 프로그래밍의 중요한 개념 중 하나로, 다형성을 구현하는 데 핵심적인 역할을 합니다. 가상 함수는 주로 <a href='https://sangseek.com/sangseeks/상속 관계/ko'>상속 관계</a>에 있는 클래스에서 사용되며, 런타임에 어떤 함수가 호출될지를 결정하는 메커니즘을 제공합니다. 이를 통해 프로그램의 유연성과 확장성을 높일 수 있습니다. 1. 가상 함수의 정의 가상 함수는 기본 클래스에서 선언되며, 파생 클래스에서 재정의(override)할 수 있는 멤버 함수입니다. 기본 클래스에서 가상 함수로 선언된 함수는 파생 클래스에서 동일한 이름과 매개변수를 가진 함수로 재정의할 수 있습니다. 이때, 기본 클래스의 포인터나 참조를 통해 파생 클래스의 객체를 참조할 경우, 실제 객체의 타입에 따라 적절한 함수가 호출됩니다. 2. 가상 함수의 선언 가상 함수는 기본 클래스에서 `virtual` 키워드를 사용하여 선언합니다. 예를 들어: ```cpp class Base { public: virtual void show() { std::cout << "Base class show function called." << std::endl; } }; class Derived : public Base { public: void show() override { // override 키워드는 선택적이지만 권장됨 std::cout << "Derived class show function called." << std::endl; } }; ``` 위의 예제에서 `Base` 클래스의 `show` 함수는 가상 함수로 선언되었고, `Derived` 클래스에서 이를 재정의했습니다. 3. 다형성(Polymorphism) 가상 함수의 가장 큰 장점은 다형성을 제공한다는 것입니다. 다형성은 동일한 인터페이스를 통해 서로 다른 객체를 다룰 수 있게 해줍니다. 예를 들어, 다음과 같이 사용할 수 있습니다: ```cpp void display(Base* b) { b->show(); // 런타임에 어떤 show()가 호출될지 결정됨 } int main() { Base b; Derived d; display(&b); // Base class show function called. display(&d); // Derived class show function called. return 0; } ``` 위의 코드에서 `display` 함수는 `Base` 클래스의 포인터를 매개변수로 받습니다. 이 포인터가 `Base` 객체를 가리킬 때와 `Derived` 객체를 가리킬 때 각각 다른 `show` 함수가 호출됩니다. 4. 가상 함수 테이블(Virtual Table) 가상 함수는 내부적으로 가상 함수 테이블(<a href='https://sangseek.com/sangseeks/vtable/ko'>vtable</a>)이라는 구조를 사용하여 구현됩니다. 각 클래스는 자신만의 vtable을 가지며, 이 테이블은 해당 클래스의 가상 함수에 대한 포인터를 저장합니다. 객체가 생성될 때, 해당 객체는 자신의 클래스의 vtable을 가리키는 포인터를 가지고 있습니다. 이를 통해 런타임에 적절한 함수가 호출될 수 있습니다. 5. 순수 가상 함수와 추상 클래스 가상 함수는 순수 가상 함수로 선언될 수도 있습니다. 순수 가상 함수는 기본 클래스에서 구현이 없고, 파생 클래스에서 반드시 재정의해야 하는 함수입니다. 순수 가상 함수는 다음과 같이 선언합니다: ```cpp class AbstractBase { public: virtual void show() = 0; // 순수 가상 함수 }; ``` 이렇게 선언된 클래스는 추상 클래스가 되며, 직접 인스턴스를 생성할 수 없습니다. 반드시 파생 클래스에서 이 함수를 구현해야 합니다. 6. <a href='https://sangseek.com/sangseeks/가상 소멸자/ko'>가상 소멸자</a> 가상 함수는 소멸자에도 적용할 수 있습니다. 기본 클래스의 소멸자를 가상으로 선언하면, 파생 클래스의 객체가 <a href='https://sangseek.com/sangseeks/삭제/ko'>삭제</a>될 때 올바른 소멸자가 호출됩니다. 이는 메모리 누수를 방지하는 데 중요합니다. ```cpp class Base { public: virtual ~Base() { std::cout << "Base destructor called." << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called." << std::endl; } }; ``` 7. 성능 고려사항 가상 함수는 다형성을 제공하지만, 성능 측면에서 약간의 오버헤드가 발생합니다. 이는 함수 호출 시 vtable을 참조해야 하기 때문입니다. 따라서 성능이 중요한 경우, 가상 함수를 사용하기 전에 신중하게 고려해야 합니다. 결론 C++에서 가상 함수는 객체 지향 프로그래밍의 핵심 요소로, 다형성을 통해 코드의 유연성과 재사용성을 높이는 데 기여합니다. 가상 함수의 사용은 상속과 함께 이루어지며, 이를 통해 다양한 객체를 동일한 인터페이스로 다룰 수 있습니다. 가상 함수와 관련된 개념들을 잘 이해하고 활용하면, 더 나은 객체 지향 프로그래밍을 할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기