이렇게 모모 하지 말자, 모모 하자. 이런식으로 나온 제목을 보고 있노라면, 마음이 편해진다. 생각할 필요 없이 그대로 믿고 따르면 되기 때문이다.(.. 물론 알아야 할 필요가 없다는것은 아니지만. ㅋ)


왜냐하면 함수의 디폴트 매개변수는 정적 바인딩되고, 상속되는 함수는 동적으로 바인딩 되기 때문이다. .. 이렇게만 정리하면 편하겠지만, 정적 바인딩, 동적 바인딩에 대해서 알아야 더 편한 세상에 살수 있어, 정리해 둔다.


정적 바인딩이란, 확실한 것들을 미리 묶는다라는 개념으로. 미리 묶었기 때문에 예측하여 캐싱할수가 있어, 더 빠르다. 공식적으론 선행 바인딩(Early Binding)이라 부른다.(이 말이 개인적으로 더 좋다고 보는데..)
동적 바인딩이란,  유동적이기에 미리 묶을수 없지만, 동적으로 다양한것들을 묶을수 있다. 이것도 캐싱은 가능하지만, 캐싱 실패를 할 수 있다. 공식적으론 지연 바인딩(Late binding)이라 부른다.


소스 코드와 간략한 주석을 단다.

여기서 보면 pb 와 pd는 De를 동적바인딩 시켰다. 여기서 De의 상속받은 함수들을 호출 하려 하면, 소스와 같이 해야 하는데, De의 디폴트 매개변수가 각각 2, 20 인데도 불과하고  pb로 호출하면 CBase에서 정한 디폴트 매개변수로 할당을 된다. 왜냐하면 pb에서 호출된 함수의 디폴트 매개변수는 이미 pb에 의해 정적 바인딩(선행 바인딩)을 했기 때문이다.  함수의 정의가 돌아가는것은 둘다 Derived의 함수를 호출하지만 매개변수는 pb이면 Base의 디폴트 매개변수를 pd이면 Derived의 디폴트 매개변수로 정적 바인딩(선행 바인딩)되어 사용 되어 진다!


그렇다면 디폴트 매개변수가 있으면, 파생 클래스에선 이 디폴트 매개변수를 일일이 다 정의 해야 하는 번거로움은 어떻게 해야 하는가?
이것이 문제라면 가상함수 호출 방법을 대처할, 다른 호출방법으로 가상함수를 구현하면 된다. 다른 방법으로 가상함수를 대처하는 아이디어는 항목35에 글을 써 두었으니 참고 하길 바란다.



이것만은 잊지 말자!
1. 상속관계에 있는 함수들의 기본 매개변수를 재정의 해서는 안된다.
2. 책에서의 가상함수 범주안에는 순수 가상함수도 들어 간다는것을 잊지 말아야 할 것이다.


관련링크
http://ikpil.tistory.com/339
http://ikpil.tistory.com/505
http://lejewk.tistory.com/75
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요