Skip to content

Latest commit

 

History

History
55 lines (42 loc) · 3.54 KB

File metadata and controls

55 lines (42 loc) · 3.54 KB

항목 19. 클래스 설계는 타입 설계와 똑같이 취급하자

  • C++에서 새로운 클래스를 정의하는 것은 새로운 타입을 하나 정의하는것이다.
  • 함수와 연산자 오버로드, 메모리 할당 및 해제 제어, 객체 초기화 및 종료처리 정의 모두 설계할 수 있다.
  • 좋은 타입을 설계하는것은 까다롭다.

좋은 타입?

  • 문법이 자연스럽다.
  • 의미구조가 직관적이다.
  • 효율적인 구현이 한 가지 이상 가능해야 한다.

클래스를 설계할때 고려해야할 질문들

1. 새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가

  • 생성자소멸자의 설계가 바뀐다.
  • 메모리 할당 함수를 직접 작성할 경우 위 함수의 설계에도 영향을 미친다.

2. 객체 초기화는 객체 대입과 어떻게 달라야 하는가

3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가

  • 값에 의한 전달을 구현하는 쪽은 복사 생성자이다.

4. 새로운 타입이 가질 수 있는 값에 대한 제약은 무엇으로 잡을 것인가

  • 클래스 멤버의 몇 가지 조합 값은 반드시 유효해야 한다. (클래스의 불변속성)
  • 특히 생성자, 대입 연산자, 쓰기 함수가 중요하다.

5. 기존의 클래스 상속 계통망에 맞출 것인가

6. 어떤 종류의 타입 변환을 허용할 것인가

  • 암시적 변환을 허용하고 싶다면?
    • 타입 변환 함수를 만든다.
    • 인자 한 개로 호출될 수 있는 비명시호출 생성자를 만든다.
  • 명시적 변환만 허용하고 싶다면?
    • 해당 변환을 맡는 별도 이름의 함수를 만들되 타입 변환 연산자 혹은 비명시호출 생성자는 만들지 말아야 한다.

7. 어떤 연산자와 함수를 두어야 의미가 있을까

8. 표준 함수들 중 어떤 것을 허용하지 말 것인가

9. 새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가

  • public, protected, private 중 어느것으로 선언할지 결정해야 한다.

10. 선언되지 않은 인터페이스로 무엇을 둘 것인가

11. 새로 만드는 타입이 얼마나 일반적인가

  • 타입 하나를 정의하는 것이 아니고 동일 계열의 타입군 전체를 정의해야 할 수도 있다.
  • 동일 계열의 타입군 전체라면 새로운 클래스가 아닌 클래스 템플릿을 정의해야 한다.

12. 정말로 필요한 타입인가

  • 기존 클래스에 대해 기능 일부가 아쉬워서 파생 클래스를 새로 만들고 있다면?
    • 비멤버 함수템플릿을 몇 개 더 정의하는 편이 낫다.