클래스를 설계하는 것은 새로운 타입을 정의하는 것이다. 따라서 언어 제작자가 기본 타입들을 설계할 때 들인 노력만큼이나 많은 노력을 들여서 설계해야한다.
좋은 클래스는 문법이 자연스럽고, 의미구조가 직관적이며, 효율적인 구현이 한가지 이상 가능해야 한다.
클래스 설계에서 신경 써야할 부분들은 다음과 같다.
1. 새로정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가
- 이에 따라 생성자와 소멸자의 설게가 바뀐다.
2. 객체 초기화는 객체 대입과 어떻게 달라야 하는가
- 생성자와 대입 연산자의 동작 및 둘 사이의 차이점을 결정짓는 요소이다.
3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가.
- 클래스의 데이터 멤버끼리의 조합이 유효해야 한다. 이를 불변속성이라한다.
4. 기존의 클래스 상속 계통망에 맞출 것인가.
- 기존 클래스를 상속할 것인가 혹은 상속될 클래스로 만들 것인가에 따라 멤버함수를 가상함수로 만들지를 결정.
5. 어떤 종류의 타입 변환을 허용할 것인가
- 암시적 타입 변환을 허용할 것인가. 혹은 명시적 타입 변환만 허용할 것인가.
6. 어떤 연산자와 함수를 두어야 의미가 있을까.
7. 표준 함수들 중 어떤 것을 허용하지 않을 것인가.
- private로 선언할 함수들
8. 새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가.
- private, protected, public, 또는 friend로 할 멤버를 결정.
9. 선언 되지 않은 인터페이스로 무엇을 둘 것인가.
- 만든 타입이 사용자가 손대지 않아도 되도록, 어떤 것을 사용자가 손댈수 없게 하고, 어떤것을 보장해줄 것인가.
10. 새로 만드는 타입이 얼마나 일반적인가
- 만드는 타입이 하나의 타입이 아니라 동일 계열 타입군 전체일지도 모른다. 이때는 새로운 클래스가 아닌 새로운 클래스 템플릿을 만들어야한다.
11. 정말 꼭 필요한 타입인가
- 기존의 클래스에 포함시킬 수 있다면 굳이 클래스로 만들 필요가 없다.