-
[C/C++ 강좌] 90강. 정사각형-직사각형 문제C++ 2022. 1. 21. 18:51
https://www.youtube.com/watch?v=13Cf6bs70cQ&list=PLlJhQXcLQBJqywc5dweQ75GBRubzPxhAk&index=95
1. delete
#include <iostream> using namespace std; class Rectangle { public: Rectangle(double a, double b) : a(a), b(b) {} virtual ~Rectangle() {} void ResizeX(double k) { a *= k; } void ResizeY(double k) { b *= k; } private: double a, b; }; class Square : public Rectangle { public: Square(double a) : Rectangle(a, a) {} }; int main() { Square a(3); a.ResizeX(2); }
위와같은 클래스를 설계할 때 Square클래스는 정사각형을 나타내는 클래스이고 Rectangle클래스는 직사각형을 나타내는 클래스이다. ResizeX(double k) 메서드는 X축의 길이를 재조정하는 메서드이고 ResizeY(double k)메서드는 Y축의 길이를 재조정하는 메서드이다. 그런데 Rectangle클래스를 상속받는 Square는 ResizeX()메서드를 이용하는 순간 X, Y의 길이가 달라져서 정사각형의 성질이 사자리고 직사각형이 되어버린다.
이러한 문제점은 ResizeX, ResizeY를 사용하지 않으면 되지만 실수로 쓰지말란 법은 없다.
이것을 막기위해서 delete키워드를 이용하면 된다.
class Square : public Rectangle { public: void ResizeX(double k) = delete; void ResizeY(double k) = delete; void ResizeXY(double k) { Rectangle::ResizeX(k); Rectangle::ResizeY(k); } Square(double a) : Rectangle(a, a) {} };
그러나 이러한 방법에도 문제점이 있다. 업캐스팅을 통해 인스턴스를 생성하면 delete를 했음에도 ResizeX(), ResizeY()메서드가 호출이 되기 때문이다.
int main() { Rectangle *a = new Square(3); a->ResizeX(2); }
2. immutable(불변) 클래스
불변 클래스는 모든 멤버가 const로 선언된 클래스를 불변 클래스라고 한다.
#include <iostream> using namespace std; class Rectangle { public: Rectangle(double a, double b) : a(a), b(b) {} Rectangle ResizeX(double k) const { return Rectangle(a * k, b); } Rectangle ResizeY(double k) const { return Rectangle(b, a * k); } double GetA() const { return a; } double GetB() const { return b; } private: const double a, b; }; class Square : public Rectangle { public: Square(double a) : Rectangle(a, a) {} }; int main() { Square s(10); Rectangle r = s.ResizeX(2); cout << s.GetA() << endl; cout << s.GetB() << endl; cout << r.GetA() << endl; cout << r.GetB() << endl; }
이렇게 설계하면 출력은 항상 Rectangle이므로 Square를 통해 Resize를 하여도 문제가 없다.
'C++' 카테고리의 다른 글
[C/C++ 강좌] 92강. 템플릿 (2) - 템플릿 특수화와 비타입 파라미터 (0) 2022.01.22 [C/C++ 강좌] 91강. 템플릿 (1) - 함수 템플릿과 클래스 템플릿 (0) 2022.01.22 [C/C++ 강좌] 89강. 다중 상속과 다이아몬드 문제 (0) 2022.01.21 [C/C++ 강좌] 86강. 객체 지향 프로그래밍의 4대 원리 (2) (0) 2022.01.20 [C/C++ 강좌] 85강. 객체 지향 프로그래밍의 4대 원리 (1) (0) 2022.01.20