C++에서 새로운 클래스를 정의 한다는 것은 새로운 타입을 하나 정의하는 것과 같습니다.
좋은 타입이란?
1) 문법이 자연스러움
2) 의미구조가 직관적
3) 효율적인 구현이 한가지 이상 가능해야 합니다.
클래스 설계시 신경써야 하는 것?
1) 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
메모리 할당 함수(operator new, operator delete)들을 직접 작성시 생성자, 소멸자에 대한 설계에 영향을 미치게 됩니다.
2) 객체 초기화는 객체 대입과 어떻게 달라야 하는가?
초기화와 대입을 확실히 헷갈리지 않는 거이 가장 중요합니다.
3) 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?
어떤 타입에 대해 '값에 의한 전달'을 구현하는 쪽은 복사 생성자입니다.
4) 새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가?
5) 기존의 클래스 상속 계통망에 맞출 것인가?
멤버 함수가 가상인가 비가상인가의 여부가 상속에 있어서 큰 요인이 됩니다. 다른 클래스들이 상속할 수 있게 만들자고 결정했다면, 이에 따라 멤버 함수의 가상 함수 여부가 결정됩니다. 특히 소멸자가 그렇습니다.
6) 어떤 종류의 타입 변환을 허용할 것인가?
암시적 : T1 -> T2 타입 변환시 T1 클래스에 타입변환 함수를 넣어두던가, 인자 1개로 호출되는 non-explicit 생성자를 T2에 넣는다.
명시적 : 해당 변환을 맡는 별도 이름의 함수를 만들되 위에서 언급한 것들은 만들지 않는다.
7) 어떤 연산자와 함수를 두어야 의미가 있을까?
8) 표준 함수들 중 어떤 것을 허용하지 말 것인가?
허용되지 않는 것은 private 멤버가 될 것이다.
9) 새로운 타입의 멤버에 대한 접근권한을 어느쪽에 줄 것인가?
private, protected, public 영역 및 프렌드 등에 대한 고민이다.
10) 선언되지 않은 인터페이스로 무엇을 둘 것인가?
보장할 수 있는 부분은 수행 성능 및 예외 안전성, 그리고 자원 사용이다. 보장한다고 결정하면 클래스 구현에 있어 제약으로 작용한다.
11) 새로 만드는 타입이 얼마나 일반적인가?
12) 정말로 꼭 필요한 타입인가?
기존 클래스에 기능 몇개가 아쉬워 파생 클래스를 새로 정의한다면, 간단하게 비멤버 함수나 템플릿을 정의하는 것이 낫다.
이것 만은 잊지 말자!
◆ 클래스 설계는 타입 설계입니다. 새로운 타입을 정의하기 전에, 이번 항목에 나온 모든 고려사항을 빠짐없이 점검해 보십시오.
'0x0001 > Effective C++' 카테고리의 다른 글
[Effective C++] 항목 20 : 값에 의한 전달보다는 상수객체 참조자에 의한전달 방식을 택하는 편이 대개 낫다. (0) | 2019.02.13 |
---|---|
[Effective C++] 항목 18 : 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 (0) | 2019.02.13 |
[Effective C++] 항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 (0) | 2019.02.13 |
[Effective C++] 항목 16 : new 및 delete를 사용할 때는 형태를 반드시 맞추자 (0) | 2019.02.13 |
[Effective C++] 항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자 (0) | 2019.02.12 |