본문 바로가기
SWE/C++ OOP

[c++] virtual function 가상함수 / 동적 바인딩 / 오버라이딩/ 순수가상함수

by S나라라2 2019. 9. 26.
반응형

가상함수 virtual function

: 함수를 가상(virtual)으로 만드는 것은 컴파일러에게 "나는 함수가 어떻게 구현되는지 모른다. 프로그램에서 사용될 때까지 기다려라. 그리고 객체 인스턴스로부터 구현을 얻어라." 라고 말하는 것이다.

 

동적 바인딩 dynamic binding

: 프로시저의 구현을 결정하는 실행시간까지 기다리는 기법을 종종 사후 바인딩(late binding) 혹은 동적 바인딩(dynamic binding)이라고 부른다.

 

가상함수는 C++가 사후 바인딩을 제공하는 방법이다. 

 

다형성 polymorphism

: 다형성은 사후 바인딩 기법의 수단으로 한 함수 이름에 여러 의미를 연관시키는 능력을 말한다. 그리하여 다형성, 사후 바인딩 그리고 가상 함수는 실제로 모두 같은 주제이다.

 

오버라이딩 overridden

: 가상 함수 정의가 파생 클래스에서 변경될 때 프로그래머는 종종 함수 정의가 오버라이딩(overridden)되었다고 말한다. C++에서 재정의(redefined)와 오버라이딩(overridden)을 보통 구별한다.

이 두 용어는 파생 클래스에서 함수의 정의를 바꾸는 것을 말한다.

만일 함수가 가상 함수라면 이 동작을 오버라이딩(overriding)이라 부른다. 

만일 이 함수가 가상 함수가 아니라면 이것을 재정의(redefining)라고 부른다.

두 경우 모두 표현 형태는 같기 때문에 구별하는 것이 어리석게 보이지만, 컴파일러는 두 경우를 다르게 취급한다.

 

가상 함수 사용의 단점?

왜 C++컴파일러는 (자바와 같은 다른 언어처럼) 모든 멤버 함수를 자동으로 가상으로 정의하지 않을까?

=> 함수를 가상으로 만들기 위해서는 많은 오버헤드가 필요하기 때문이다. 함수를 가상으로 만들면 함수가 가상이 아닐 때보다 더 많은 저장 공간을 사용하고 프로그램의 실행이 늦어지게 된다. 

 

순수 가상 함수 pure virtual function

-순수 가상함수 생성 방법 : 가상으로 만들고 다음과 같이 멤버 함수 선언에 annotation =0을 추가하는 것.

virtual void draw() = 0;

 

추상 클래스 abstract class

: 하나 이상의 순수 가상 함수를 가지는 클래스를 추상 클래스 라고 부른다.

추상 클래스는 다른 클래스를 유도하도록 기반 클래스(parent class)로서만 사용될 수 있다. 

만일 추상 클래스로부터 클래스가 파생되면, 파생 클래스는 모든 상속된 순수 가상 함수에 대한 정의를 정의하지 않으면 (또한 새로운 순수 가상 함수를 작성하지 않으면) 그 자체가 추상 클래스이다.

만일 상속받은 순수 가상 함수에 대한 정의가 제공된다면 (그리고 역시 새로운 순수 가상 함수를 작성하지 않는다면) 결과 클래스는 추상 클래스가 아니고 클래스의 객체를 생성할 수 있다는 것을 의미한다.

 

 

 

C++는 가상 함수를 어떻게 구현하나?

=> 가상 함수를 가지는 (C++를 포함하여) 모든 언어의 컴파이러들은 기본적으로 같은 방법으로 가상 함수를 구현한다.

하나의 클래스가 가상인 여러 멤버 함수를 가진다면 컴파일러는 그 클래스에 대해 가상 함수 테이블 ( virtual function table)이라 불리는 것을 생성한다. 이 테이블은 각 가상 멤버 함수에 대한 포인터 (메모리 주소)를 가진다. 이 포인터는 그 멤버 함수에 대한 올바른 코드의 위치를 가리킨다. 하나의 가상 함수가 상속받고 변하지 않는다면 이것의 테이블 엔트리는 부모 클래스 (혹은 필요하다면 조상 클래스)에서 주어진 그 함수의 정의를 가리킨다. 또 다른 가상 함수가 클래스에서 새로운 정의를 가지면 그 멤버 함수에 대한 테이블에서 포인터는 그 정의를 가리킨다. (가상 함수의 속성이 상속되므로 일단 클래스가 가상 함수 테이블을 가지면 모든 자손 클래스는 가상 함수 테이블을 가진다는 것을 기억해라.)

 

 

 

참고 : 책 [객체지향 원리로 이해하는 ABSOLUTE C++ second edition ]

반응형