블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2008. 1. 15. 05:02 프로그래밍/C++

음.. 아주 중요한 단어가 드디어 등장했다. 순수 가상 함수... Pure Virtual Function이군.

자바를 해본 사람이라면 아마도 너무나도 당연한 개념일 것이고 나처럼 C++를 구렁이 담 넘어 가듯이 알고 있는 사람이라면 왜 이말이 중요한지 아직 모를수도 있다.

C++의 큰 장점은 "다형성" 이라고 할 수 있다.

부모 클래스로 부터 차례 차례 상속을 받아 필요로 하는 함수와 멤버를 상속 받고 최종 자식 클래스는 자신이 필요한 것들을 정의하면 된다.

이때 앞에서 본 가상 함수가 필요한데, 왜 필요한가 하면은....

C프로그램을 짤때는 흔히 포인터를 선언하고 포인터를 이용해 멤버 함수를 호출하곤 한다. 이때 부모클래스의 포인터를 선언하고 자식 클래스를 대입한후 자식 클래스의 멤버 함수(부모 클래스도 같은 이름의 멤버 함수를 가지고 있다면)를 호출하고자 한다면 반드시 "동적 결합"을 해야 하고 그 동적 결합을 위해서는 반드시 부모 클래스의 멤버 함수 앞에 "Virtual"이라는 키워드를 넣어야 한다.

그렇지 않고 "정적 결합"을 하게 되면 (Virtual 키워드를 안적으면) 포인터가 선언될 당시의 타입 (부모 클래스 타입이죠)의 멤버 함수만 계속 호출하게 된다.

그래서 가상 함수라는 것이 필요로 하는데 여기서 새로 등장한 순수 가상 함수란,

아무것도 정의 되지 않은 가상 함수를 말한다... 그리고 이것을 가지는 클래스를 바로 추상 클래스 (abstract class)라한다.

그렇다면 왜 비어있는 가상 함수를 선언하는가? 바로 이 질문이 나와야 한다.

질문의 답이 바로 저 위에 써놓은 C++ 장점 때문이다. 다형성을 실현하기 위해서는 동적 결합을 해야 하는데 그렇게 하기 위해서는 서로 다른 형태를 가지는 자식 클래스들이 공통의 부모 클래스를 가질 필요가 있다.

그렇게 되어야 부모 클래스 타입의 포인터를 배열로 할당해서 자식 클래스를 각각의 배열 요소로 가지도록 한다음 임의의 자식 클래스 객체의 멤버 함수를 호출 했을때 그 클래스에 맞는 멤버 함수가 자동으로 호출되게 할 수 있다는 것이다.

개념이 쉽지는 않다. 하지만 알고나면 "아... 이게 꼭 필요하긴 하겠구나" 하는 생각이 든다.

자바를 예전에 잠깐 써봤을때 추상 클래스에 대해서 수도 없이 들었지만 사실 왜 필요한가에 대한 대답은 몰랐었다. 하지만 지금 보니 왜 추상 클래스가 필요한지 알겠다.

posted by 대갈장군