이렇게 모모 하지 말자, 모모 하자. 이런식으로 나온 제목을 보고 있노라면, 마음이 편해진다. 생각할 필요 없이 그대로 믿고 따르면 되기 때문이다.(.. 물론 알아야 할 필요가 없다는것은 아니지만. ㅋ)
왜냐하면 함수의 디폴트 매개변수는 정적 바인딩되고, 상속되는 함수는 동적으로 바인딩 되기 때문이다. .. 이렇게만 정리하면 편하겠지만, 정적 바인딩, 동적 바인딩에 대해서 알아야 더 편한 세상에 살수 있어, 정리해 둔다.
정적 바인딩이란, 확실한 것들을 미리 묶는다라는 개념으로. 미리 묶었기 때문에 예측하여 캐싱할수가 있어, 더 빠르다. 공식적으론 선행 바인딩(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
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 42: typename의 두가지 의미를 제대로 파악하자. (12) | 2008.07.25 |
---|---|
항목 41: 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 (0) | 2008.07.25 |
항목 40: 다중 상속은 심사숙고해서 사용하자. (0) | 2008.07.25 |
항목 39 : private 상속은 심사숙고해서 구사하자 (0) | 2008.07.19 |
항목 38: "has-a(...는...를가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화 할 때는 객체 합성을 사용하자. (2) | 2008.07.18 |
항목 36 : 상속받는 비가상 함수를 파생 클래스에서 재정의 하는 것은 절대 금물! (1) | 2008.07.14 |
항목 35: 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자. (0) | 2008.07.14 |
항목 34: 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자. (0) | 2008.07.09 |
항목 33: 상속된 이름을 숨기는 일은 피하자 (4) | 2008.07.02 |
항목 32: public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자. (0) | 2008.07.02 |
최근댓글