[Effective C++] #19 클래스 설계
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 19 "클래스 설계는 타입 설계와 똑같이 취급하자"에 해당하는 내용입니다.
클래스 설계
함수와 연산자를 오버로드 하고, 메모리 할당 및 해제를 제어하며, 객체 초기화 및 소멸을 정의하는 작업이 클래스 설계입니다. 몇 가지 질문들에 대해 고찰하며, 효과적인 클래스 설계에 대한 방향을 짐작해 보겠습니다.
1. 객체 생성 및 소멸은 어떻게 이루어지는가?
이 질문을 통해, 우리는 클래스 생성자 및 소멸자의 설계를 준비합니다. 더불어, 메모리 할당 함수를 직접 작성할 경우에도 영향을 미칩니다.
2. 객체 초기화와 객체 대입의 차이
// 대입
class A {
public:
A();
private:
int x = 3;
int y = 5;
};
// 객체 초기화
class A {
public:
A(int x_val, int y_val):
x(), y() {}
private:
int x;
int y;
};
생성자와 대입 연산자의 차이점을 결정하는 요소입니다. 초기화와 대입을 헷갈리지 않고 설계해야 합니다. 이들의 호출 동작은 다르기때문입니다.
3. 객체가 값에 의해 전달되는 경우에 어떤 의미를 갖는가?
class Hardy {
public:
Hardy(int x_val, int y_val):
x(x_val), y(y_val) {}
int x;
int y;
};
// 값에 의한 전달, 복사 생성자 호출
void setHardy (Hardy h){
h.x = 3;
h.y = 5;
}
int main () {
Hardy a1(2, 3);
setHardy(a1);
}
'값에 의한 전달'이란, 복사 생성자의 호출을 의미합니다. setHardy 함수는 Hardy 클래스의 객체를 매개변수로 받습니다. 이때. 값에 의한 전달은 복사본을 생성하므로, 인자로 받는 Hardy 객체의 복사본을 생성하기 위해 복사 생성자를 호출하게 됩니다.
4. 기존의 클래스 상속 계통망에 맞출 것인가?
기존의 클래스로부터 새로 작성한 클래스를 상속시킨다고 한다면, 새로 작성한 클래스는 기존의 클래스에 의해 제약을 받게 됩니다. 이때, 기존 클래스의 멤버 함수의 가상 여부가 가장 큰 요인이 됩니다. 우리가 작성하는 클래스들이 상속할 수 있게 만들자고 결정했다면, 멤버 함수의 가상 함수 여부 또한 결정해야 합니다!
5. 어떤 종류의 타입 변환을 허용할 것인가?
T1 타입으로부터 T2타입으로 변환하기 위해, 우리는 명시적 타입 변환 혹은 암시적 타입 변환을 고려해야 합니다. 암시적 변환을 원한다면, T1 클래스에 타입 변환 함수를 넣어 두고, 명시적 타입 반환을 원한다면, 별도 이름의 함수를 만들고 타입 변환 연산자 혹은 비 명시 호출 생성자를 만들지 않아야겠죠.
6. 어떤 함수와 연산자를 두어야 의미가 있을까?
당연한 얘기입니다.
7. 표준 함수들 중 어떤 것을 허용할 것인가?
private로 선언해야 하는 함수가 무엇일지 판단해야겠죠.
8. 멤버에 대한 접근권한을 어떻게 설정할 것인가?
새로 작성한 클래스 멤버를 public, private, 그리고 protected 영역 중 어디에 둘 것인가를 결정하는 요소입니다. 더불어 프렌드 함수 등의 결정을 내리는데도 생각해 봐야 할 요소입니다.
9. 새로 만드는 클래스는 얼마나 일반적인가?
새로 정의하는 클래스가 얼마나 일반적인지 판단하고, 클래스 템플릿을 고려해봐야 합니다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #21 함수의 객체 반환, 참조자 반환 (0) | 2022.01.27 |
---|---|
[Effective C++] #20 값에 의한 전달, 참조자에 의한 전달 (0) | 2022.01.24 |
[Effective C++] #18 인터페이스 설계 (0) | 2022.01.18 |
[Effective C++] #17 자원 관리 객체와 new 사용 (0) | 2022.01.17 |
[Effective C++] #16 new 및 delete 사용 (0) | 2022.01.17 |