C++/Effective C++

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

멍청이 개발자 2024. 1. 20. 20:13
반응형

자, 사실 제목이 너무 당연한 소리이긴 하다. 클래스 자체가 사용자가 직접 정의한 타입이니까 말이다. 하지만 이번 항목에서는 그런 당연한 소리를 하려고 만들어진 것이 아니다. 이번 항목에서는 우리가 클래스를 설계할 때 스스로에게 던져야할 질문들을 모아놓았다. 그 질문들을 하나씩 살펴보도록 하자.

 

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

이 부분에 따라 클래스의 생성자와 소멸자의 설계가 바뀐다. 또한 메모리 할당함수(operator new, operator delete)를 직접 작성 할 경우에는 이들 함수의 설계에도 영향을 미친다.

 

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

생성자와 대입 연산자의 동작 및 둘의 차이점을 결정짓는 것이다. 초기화와 대입을 헷갈려서는 안된다. 서로 다른 함수가 호출된다. 항목 4참조

 

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

자 여기서 값에 의해 전달되는 것은 바로 복사생성자를 이용하게 된다는 점을 유의하자.

 

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

전부는 아니지만 클래스 데이터 멤버의 몇 가지 조합 값만은 반드시 유효해야한다. 이런 조합을 가리켜 클래스의 불변속성이라고 하고 클래스 차원에서 지켜주어야 하는 부분이다. 

 

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

이미 가지고 있는 클래스로 부터 상속을 시킨다고 하면, 우리의 설계는 이 클래스에 의해 제약을 받게된다. 특히 멤버 함수가 가상인지 비가상인지도 중요하다. 이에 따라 멤버 함수의 가상 함수 여부가 결정된다.

 

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

간단히 말해 명시적 변환만 허용할지 아니면 암시적 변환도 허용할지에 대한 질문이다.

 

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

어떤 것들은 멤버함수가 적당할 것이고 또 몇몇은 비 멤버가 적당할 수도 있고 또 어떤것은 정적 함수가 적당할 수도 있다. 이러한 것들을 고려하자는 것이다.

 

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

항목6에서 이야기한 복사 생성자 및 대입 연산자를 private에 선언하여 막아버리는 것에 대한 내용이다.

 

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

멤버를 public, private, protected중 어디에 둘지를 결정하는 것이다.

 

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

우리가 만들 타입이 제공할 보장이 어떤 종류일까에 대한 질문이다. 보장할 수 있는 부분은 수행 성능 및 예외 안전성 그리고 자원 사용(잠금 및 동적 메모리 등)이다.

 

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

일반적인 클래스를 만들지 클래스 템플릿을 만들지에 대한 질문이다.

 

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

기존 클래스에 대해 기능 몇 개가 아쉬워서 파생 클래스를 새로 뽑고 있다면 차라리 간단하게 비멤버 함수라든지 템플릿을 몇 개 더 정의하는 편이 낫다.

 

오늘은 클래스 설계에 있어서 한 번쯤은 생각해봤으면 하는 질문을 살펴 보았다. 이 모든것을 다 고려하기는 힘들겠지만 그래도 머릿속에 염두해두고 설계를 하도록 하자.

반응형