Shape
공통 상태protected name을 부모가 초기화합니다.
기본 메서드displayInfo()는 모든 도형이 공유합니다.
추상 메서드calculateArea()와 getPerimeter()는
자식이 구현합니다.
abstract class는 직접 생성할 수 없지만, 자식 클래스가
반드시 채워야 할 메서드 슬롯을 컴파일 시점에 확인합니다.
공통 상태protected name을 부모가 초기화합니다.
기본 메서드displayInfo()는 모든 도형이 공유합니다.
추상 메서드calculateArea()와 getPerimeter()는
자식이 구현합니다.
radius를 받아 넓이와 둘레 계산식을 채웁니다. 공통
출력 로직은 부모 것을 그대로 씁니다.
width와 height로 같은 계약을 다른 계산
방식으로 만족합니다.
new Shape()는 금지되지만, Shape[] 타입으로
여러 자식 인스턴스를 묶어 다형적으로 처리할 수 있습니다.