C++에서 새로운 클래스를 정의한다는 것은 새로운 타입을 하나 정의하는 것과 같다.
하기 항목들은 클래스 설계 시 고려해야 되는 항목들이다.
- 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
- 객체 초기화는 객체 대입과 어떻게 달라야 하는가?
생성자와 대입 연산자의 동작 및 둘 사이의 차이점을 결정짓는 요소이다.
초기화와 대입을 헷갈리지 않는 것이 가장 중요하다.
- 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?
어떤 타입에 대해 '값에 의한 전달'을 구현하는 쪽은 복사 생성자이다.
- 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가?
- 기존의 클래스 상속계통망에 맞출 것인가?
이미 가지고 있는 클래스로부터 상속을 시킨다면, 이들 클래스에 의해 제약을 받는다. 특히 멤버 함수가 가상인지 비가상인가의
여부가 가장 큰 요인이다.
내가 만든 클래스를 다른 클래스들이 상속할 수 있게 만들자고 결정했다면, 멤버 함수의 가상 함수 여부가 결정된다.
특히 소멸자가 이런 경우에 해당한다.
- 어떤 종류의 타입 변환을 허용할 것인가?
타입 변환이 되도록 하고 싶다면 암시적/명시적 타입 변환을 선택해서 만들어야 한다.
- 어떤 연산자와 함수를 두어야 의미가 있을까?
어떤 것들이 멤버 함수로 적당할 것이고, 또 몇몇은 그렇지 않을 것이다. (항목 23,24,46참조)
- 표준 함수들 중 어떤 것을 허용하지 말 것인가?
어떤 함수를 private으로 선언해야 하는지 생각할 것.
- 새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가?
어떤 클래스 멤버를 public, private, protected 영여겡 둘 것인가를 결정하는데 도움을 주게 될 질문이다.
또한 프렌드로 만들어야 할 클래스 및 함수를 정하는 것은 물론이고 한 클래스를 다른 클래스에 중첩시켜도 되가는가에 대한
결정을 내리는 데도 도움을 줄 질문이다.
- 선언되지 않은 인터페이스로 무엇을 둘 것인가?
- 새로 만드는 타입이 얼마나 일반적인가?
타입 하나를 정의하는 것이 아닐지도 모른다.
설계된 클래스는 동일 계열의 타입군 전체일지도 모르기 때문에 클래스 템플릿을 정의해야할지도 모른다.
- 정말로 꼭 필요한 타입인가?
기존의 클래스에 대해 기능 몇 개가 아쉬워서 파생 클래스를 새로 뽑고 있다면, 차라리 간단하게 비멤버 함수라든지 템플릿을
몇 개 더 정의하는 편이 더 좋다.
위에 질문들은 만만하게 볼 수 없는 질문들이다. 그래서 효과적인 클래스를 정의하는 일이 무척이나 어렵다는 말이 나오는 것이다.
1줄 요약
- 클래스 설계는 타입 설계이다. 새로운 타입을 정의하기 전에, 이번 항목에 나온 모든 고려사항을 빠짐없이 점검해 보자.
'Program Language > C++' 카테고리의 다른 글
항목21. 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자. (0) | 2017.08.16 |
---|---|
항목20. '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달'방식을 택하는 편이 대개 낫다. (0) | 2017.08.11 |
항목18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자. (0) | 2017.08.09 |
항목17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자. (0) | 2017.08.09 |
항목16. new 및 delete를 사용할 때는 형태를 반드시 맞추자. (0) | 2017.08.07 |