이번 항목은 보다 전문가적 스타일에 중점을 두었으며, 이 원리를 이해 한다면, 더 유지보수가 편하고 견고한 클래스 디자인에 도움이 될 것이다.

다음 코드를 보자.


질문 : 이 코드의 오류를 얼마나 찾을 수 있나?


분석

우선.. Complex 는 복소수 클래스이다. 그런데 굳이 복소수 클래스를 정의한 것 부터가 디자인 설계의 잘못된 방법이다. 코드를 직접 만드는 것은 분명 도움이 되지만, 그것은 한번으로 족 한다. 왜냐하면 두번째 부터는 잘 만들어진 것을 어떻게 구현했는지 분석하는 일만 남았기 때문이다.

이제 코드를 뜯어보고, 어느 부분에서 잘못 했는지 알아 보자.


 이 코드의 Complex의 두번째 매개변수가 디폴트 매개변수로 사용 되어 졌다. 이것은 하나의 매개변수를 이용하여, 객체를 생성 할 수 있다는 것을 의미하며, 암시적 변환을 허용 하겠다는 것이다. 항목 39를 보면 알다 시피, 암시적 변환은 대부분 "빈대 잡으려다 초가삼간 태운다" 격이다.



이 코드를 보면 문제점이 정말 많다.
  1. 매개변수를 const Complex& other 로 받아야 더 성능에 이롭다.
  2. void 반환이 아닌 const Complex 임시 개체를 반환 해야 한다.
  3. 내부 구현이 operator+= 으로 구현 되어져야 한다.
  4. operator+ 는 클래스 외부의 클래스와 같은 namespace안에 정의 해야 한다.

이것을 한 마디로 요약한다면, "int 처럼 사용 되게 해라" 격 있다. 이 말은 Effective C++ 2판 3판 STL 등을 보면 많이 나오니, 여기선 생략한다.

1. 생략, 2 c = a + c 가 성립되어야 하고 a + b = c 가 안되어야 하기 때문에, 3. += 연산이 더 빠르다. 4. a = 1 + c 가 성립되어야 한다.

그리고 해당 클래스의 특성상 operator= 를 정의해 두어야 한다.

이 코드의 문제점은 두가지 이다.

  1. 사용상 << 와 같으므로 클래스 외부의 같은 namespace 안에 정의해야 한다.
  2. 매개변수 타입이 ostream& os 여야 더 빠르다.(const를 안붙이는 이유는 <<가 비상수 멤버함수이기 때문이다)
  3. 반환 타입이 ostream& 여야 한다.

 이 코드의 문제는 반환형이 Complex& 가 되어야 한다, 왜냐하면, 전위연산자이기 때문이다.

이 코드의 문제점은 두가지 이다.

  1. 후위연산자는 전위연산자로 구현되어야 한다.
  2. 반환 타입이 const Complex 여야 한다.
마지막으로...

이 코드의 변수 명 앞에 _ 붙였는데, 이런 앞쪽 밑줄 기법은 이미 예약되어 있다. 물론 클래스 멤버 변수에는 쓰지 않으니 괜찮겠지만, .. 차라리 안쓰는게 더 좋지 않을까? 가 필자의 의견이였다.

속편하게 뒷 밑줄이 좋을 듯 싶다고 한다. real_ 이렇게.^^ 나도 이 기법으로 사용 해야 겠다.


총평

Effective C++ 2판 3판 에서 여러 항목에 걸쳐 설명한것을 이 한 항목으로 다시 정리 해주는 느낌이였다. 그리고 한번쯤은 소스를 만들어 보고, 두번째 부터는 잘짜여진 코드를 보는게 정말 많은 실력이 늘릴 수 있다. 그리고 멤버 변수의 이름 끝에 _ 를 붙이는 습관을 길러야 겠다. m_ 는 .. 그렇더라..

이 설계 원칙은 "int 처럼 사용 되게 하라" 에 준하여 만들어 졌다. 또한 이것이 맞다고 생각한다. 모든 사람들은 int 처럼 사용 하고 있으니 말이다.




  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기