이번 항목은 보다 전문가적 스타일에 중점을 두었으며, 이 원리를 이해 한다면, 더 유지보수가 편하고 견고한 클래스 디자인에 도움이 될 것이다.
다음 코드를 보자.
질문 : 이 코드의 오류를 얼마나 찾을 수 있나?
분석
우선.. Complex 는 복소수 클래스이다. 그런데 굳이 복소수 클래스를 정의한 것 부터가 디자인 설계의 잘못된 방법이다. 코드를 직접 만드는 것은 분명 도움이 되지만, 그것은 한번으로 족 한다. 왜냐하면 두번째 부터는 잘 만들어진 것을 어떻게 구현했는지 분석하는 일만 남았기 때문이다.
이제 코드를 뜯어보고, 어느 부분에서 잘못 했는지 알아 보자.
이 코드의 Complex의 두번째 매개변수가 디폴트 매개변수로 사용 되어 졌다. 이것은 하나의 매개변수를 이용하여, 객체를 생성 할 수 있다는 것을 의미하며, 암시적 변환을 허용 하겠다는 것이다. 항목 39를 보면 알다 시피, 암시적 변환은 대부분 "빈대 잡으려다 초가삼간 태운다" 격이다.
이 코드를 보면 문제점이 정말 많다.
- 매개변수를 const Complex& other 로 받아야 더 성능에 이롭다.
- void 반환이 아닌 const Complex 임시 개체를 반환 해야 한다.
- 내부 구현이 operator+= 으로 구현 되어져야 한다.
- operator+ 는 클래스 외부의 클래스와 같은 namespace안에 정의 해야 한다.
이것을 한 마디로 요약한다면, "int 처럼 사용 되게 해라" 격 있다. 이 말은 Effective C++ 2판 3판 STL 등을 보면 많이 나오니, 여기선 생략한다.
1. 생략, 2 c = a + c 가 성립되어야 하고 a + b = c 가 안되어야 하기 때문에, 3. += 연산이 더 빠르다. 4. a = 1 + c 가 성립되어야 한다.
그리고 해당 클래스의 특성상 operator= 를 정의해 두어야 한다.
이 코드의 문제점은 두가지 이다.
- 사용상 << 와 같으므로 클래스 외부의 같은 namespace 안에 정의해야 한다.
- 매개변수 타입이 ostream& os 여야 더 빠르다.(const를 안붙이는 이유는 <<가 비상수 멤버함수이기 때문이다)
- 반환 타입이 ostream& 여야 한다.
이 코드의 문제는 반환형이 Complex& 가 되어야 한다, 왜냐하면, 전위연산자이기 때문이다.
이 코드의 문제점은 두가지 이다.
- 후위연산자는 전위연산자로 구현되어야 한다.
- 반환 타입이 const Complex 여야 한다.
이 코드의 변수 명 앞에 _ 붙였는데, 이런 앞쪽 밑줄 기법은 이미 예약되어 있다. 물론 클래스 멤버 변수에는 쓰지 않으니 괜찮겠지만, .. 차라리 안쓰는게 더 좋지 않을까? 가 필자의 의견이였다.
속편하게 뒷 밑줄이 좋을 듯 싶다고 한다. real_ 이렇게.^^ 나도 이 기법으로 사용 해야 겠다.
총평
Effective C++ 2판 3판 에서 여러 항목에 걸쳐 설명한것을 이 한 항목으로 다시 정리 해주는 느낌이였다. 그리고 한번쯤은 소스를 만들어 보고, 두번째 부터는 잘짜여진 코드를 보는게 정말 많은 실력이 늘릴 수 있다. 그리고 멤버 변수의 이름 끝에 _ 를 붙이는 습관을 길러야 겠다. m_ 는 .. 그렇더라..
이 설계 원칙은 "int 처럼 사용 되게 하라" 에 준하여 만들어 졌다. 또한 이것이 맞다고 생각한다. 모든 사람들은 int 처럼 사용 하고 있으니 말이다.
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 13 : 예외에 안전한 코드를 작성하기 - 파트 6 (0) | 2008.11.25 |
---|---|
항목 24 : 상속의 사용과 남용 (난이도 6) (2) | 2008.10.26 |
항목 23 : 클래스 관계 - 파트 2 (난이도 6) (0) | 2008.10.25 |
항목 22 : 클래스 관계 - 파트 1 (난이도 5) (0) | 2008.10.19 |
항목 21 : 가상 함수들의 재정의 (난이도 6) (0) | 2008.10.19 |
항목 30 : "Fast Pimpl" 이디엄 (난이도 4) (0) | 2008.10.17 |
항목 29 : 컴파일 방화벽 (난이도 6) (0) | 2008.10.16 |
항목 28 : 컴파일 시간 의존성 줄이기 - 파트 3 (난이도 7) (0) | 2008.10.16 |
항목 27 : 컴파일 시간 의존성 줄이기 - 파트 2 (난이도 6) (0) | 2008.10.16 |
항목 26 : 컴파일 시간 의존성 줄이기 - 파트 1 (난이도 4) (0) | 2008.10.16 |
최근댓글