[Effective C++] 항목 19 : 클래스 설계는 타입 설계와 똑같이 취급하자

수민이슈·2023년 3월 23일
0

Effective C++

목록 보기
19/30
post-thumbnail

스콧 마이어스의 Effective C++을 읽고 개인 공부 목적으로 요약 작성한 글입니다!

💡 클래스 설계는 타입 설계 이다!
새로운 타입을 정의하기 전에, 이번 항목에 나온 모든 고려사항들을 빠짐없이 점검해보도록 하자.


🖊️ 클래스 설계

클래스 설계는

  • 함수, 연산자 오버로드
  • 메모리 할당 및 해제 제어
  • 객체 초기화 및 종료 처리 정의

등 할 일이 많다.

클래스를 설계할 때는 언어의 기본 제공 타입을 설계하듯 해야 한다.


좋은 클래스 설계의 조건

  • 문법(syntax)이 자연스러운가?
  • 의미구조(semantics)가 직관적인가?
  • 효율적인 구현이 한 가지 이상 가능한가?

클래스 설계 시 고려해야 할 사항

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

클래스의 생성자, 소멸자의 설계, 메모리 할당 함수(new, delete)를 결정짓는 요소

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

생성자대입 연산자의 동작, 둘 사이의 차이점을 결정짓는 요소

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

값에 의한 전달 구현 == 복사생성자

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

클래스의 불변속성(invariant) : 클래스의 데이터 멤버의 몇 가지 조합 값 중 반드시 유효해야 하는 조합

불변속성이 영향을 미치는 부분
: 생성자, 대입 연산자, 쓰기 함수(setter), 함수가 발생시키는 예외, 예외 지정 (exception specification)

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

이미 존재하는 클래스로부터 상속시킬거라면, 이 클래스에 의해 설계에 제약이 생길거다.
(특히 멤버 함수의 가상함수 여부)

그리고 만약
내가 만든 클래스를 다른 클래스들이 상속할 수 있게 만들고 싶다면 (기본 클래스로 만들고 싶다면)
멤버 함수의 가상 함수의 여부가 결정될거다. 특히 소멸자

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

내가 만든 타입은 다른 타입들과 호환 가능 해야 한다.

T1 타입 -> T2 타입 변환 수단

  • 암시적 (implicity) 변환
    • : T1 클래스에 타입 변환 함수 정의 (operator T2)
    • : T2 클래스에 인자 하나로 호출될 수 있는 비명시호출(non-explicit) 생성자 정의
  • 명시적 (explicit) 변환
    • : 해당 변환을 맡는 별도 이름의 함수 정의
    • : 타입 변환 연산자, 비명시호출 생성자 정의하지 말아야 함.

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

클래스 안에 선언할 함수를 결정하는 요소

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

private으로 선언해야 하는 함수는 무엇?

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

클래스 멤버를 public, protected, private 영역 중 어디에 둘 것인지 결정.
friend로 만들어야 할 클래스, 함수에 대한 결정
한 클래스를 다른 클래스에 중첩시켜도 되는지에 대한 결정

- '선언되지 않은 인터페이스'로 무엇을 둘 것인가?

내가 만들 타입이 보장할 수 있는 부분은,
수행 성능 및 예외 안정성, 자원 사용 (잠금 및 동적 메모리)
내가 보장하겠다고 결정한 결과는 클래스 구현에서 제약으로 작용한다.

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

내가 정의하는 클래스가 동일 계열의 타입군 (family of types)일 수도 있다.
이럴 경우, 내가 정의해야 하는 것은 새로운 클래스 템플릿..

- 정말 꼭 필요한 타입인가?

파생 클래스를 만드는 이유가 몇 가지 기능 추가라면,
비멤버 함수나 템플릿을 몇 개 더 정의하는게 낫다.


😊

정말,,
클래스 설계는 너무 어려운 것 같다
이걸 한 번에 외우거나, 하는건 안될 것 같고
후술될 부분들까지 공부하고 난 뒤에 다시 봐야겠다.

0개의 댓글