본문 바로가기
프로그래밍 기초/C++

가상함수 - 동적 바인딩과 정적 바인딩

by junsday 2017. 5. 31.

가상함수란?


가상함수를 알아보기 전에 바인딩에 대해 알아보자.




바인딩이란?


프로그램을 실행하면 컴파일을  하고 실행코드가 만들어진다.

실행코드에서 함수 호출부분을 보면 함수가 그대로 정의되어 있지 않고 함수가 정의된 부분의 주소값이 있어서 함수를 찾아가서 실행할 수 있다.

이 때 함수 호출부와 정의부를 연결시켜주는 것이 바인딩이다.


바인딩에는 정적 바인딩과 동적 바인딩이 있는데 바인딩이 결정되는 시점에 따라 나뉜다.

정적 바인딩컴파일 시에 바인딩 할 주소가 결정되어 함수 호출 시에는 이미 결정되어 있고,

동적 바인딩은 컴파일 시에 바인딩 할 주소가 결정되지 않고 함수 호출 시에 결정된다.




일반 함수는 정적 바인딩을 하며 컴파일 시에 인스턴스의 타입에 따라 바인딩 될 주소가 결정되기 때문에 클래스를 상속받아 함수를 재정의 하고 업캐스팅을 하여도 부모클래스의 타입으로 바인딩이 되기 때문에 부모 클래스의 함수가 호출이 된다.


반면에 가상함수는 어떤 함수를 호출할 지 호출 시점에 결정이 되며 업캐스팅을 하였을 때 인스턴스의 타입이 아닌 동적으로 생성된 객체의 타입으로 바인딩이 되기 때문에 자식 클래스의 함수가 호출이 가능해진다.


이것이 가상함수를 사용하는 이유이다.


다만 가상함수를 사용하면 동적 바인딩을 하기 때문에 컴파일은 빠른 반면에 실행시간이 늦어질 수 있다.

또한 동적 바인딩을 위한 *주소값을 담을 메모리를 미리 만들어 놓기 때문에 메모리가 낭비될 수 있다.


*주소값을 담을 메모리 - 32비트 운영체제에서는 4byte, 64비트 운영체제에서는 8byte


< main.cpp >


< VirtualFunction.h >


< NormalFunction.h >


결과












'프로그래밍 기초 > C++' 카테고리의 다른 글

네임스페이스(namespace)란?  (0) 2016.11.11
getchar()  (0) 2016.11.11
생성자(Constructor)란?  (0) 2016.11.11
인자(Argument)와 매개변수(Parameter)  (0) 2016.11.11
객체란?  (0) 2016.11.11

댓글