KoreanFoodie's Study

Effective C++ | 항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자 본문

Tutorials/C++ : Advanced

Effective C++ | 항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자

GoldGiver 2022. 10. 25. 16:26

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!

항목 32 : public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자

핵심 :

public 상속의 의미는 "is-a(...는 ...의 일종)"이다. 기본 클래스에 적용되는 모든 것들이 파생 클래스에 그대로 적용되어야 한다. 왜냐하면 모든 파생 클래스 객체는 기본 클래스 객체의 일종이기 때문이다.

 

어떤 Base 클래스로부터 Derived 클래스가 public 상속을 받았다면, Derived 클래스는 Base 클래스보다 더 특수한 개념을 나타내게 된다. 사용처가 제한된다고 봐도 좋다.

public 상속이 신기한 이유는, 우리가 일반적으로 생각하고 있는 논리적인 개념과 충돌할 수 있기 때문이다. 예를 들어, 수학적으로는 직사각형이 정사각형을 포함하는 경우이므로 정사각형 클래스를 직사각형 클래스로부터 public 상속을 받게 사용할 수 있을 거라고 가정할 수 있다. 다음 코드를 보자.

class Rectangle
{
public:
	virtual void setHeight(int newHeight);
	virtual void setWidth(int newWidth);
	virtual void height() const;
	virtual void width() const;
	...
};

// r 의 넓이를 늘리는 함수
void makeBigger(Rectangle& r)
{
	int oldHeight = r.height();
	r.setWidth(r.newWidth() + 10);
	assert(r.height() == oldHeight);
}

class Square : public Rectangle
{
	...
};

Square s;
// 높이와 너비가 달라서 단언문이 거짓!
makeBigger(s);

위의 코드처럼, Rectangle 에서 통하는 코드가 Squre 에서는 에러를 낼 수도 있다. 따라서 public 상속을 할 때는 객체 지향의 관점에서 설계를 제대로 할 필요가 있다!

 

Comments