package CHAPTER07;

// 추상 클래스 Shape 정의 (추상 클래스지만 모든 메소드 구현)
abstract class Shape { 
    String name; // 도형의 이름
    double width, height, radius; // 공통 속성 추가 (사각형과 원을 위한 값)

    // 생성자: 도형의 이름 및 공통 속성 초기화
    Shape(String name, double width, double height, double radius) {
        this.name = name;
        this.width = width;
        this.height = height;
        this.radius = radius;
    }

    // 일반 메소드: 도형의 이름을 출력
    void display() { 
        System.out.println("이 도형은 " + name + "입니다.");
    }

    // 일반 메소드: 넓이 계산 (서브클래스에서 전달된 값으로 계산)
    double calculateArea() {
        if (name.equals("원")) {
            return Math.PI * radius * radius;
        } else { // 사각형
            return width * height;
        }
    }

    // 일반 메소드: 둘레 계산 (서브클래스에서 전달된 값으로 계산)
    double calculatePerimeter() {
        if (name.equals("원")) {
            return 2 * Math.PI * radius;
        } else { // 사각형
            return 2 * (width + height);
        }
    }
}

// 원(Circle) 클래스: Shape 클래스를 상속받아 구현
class Circle extends Shape { 
    // 생성자: 반지름 값을 부모 클래스에 전달
    Circle(double radius) {
        super("원", 0, 0, radius);
    }
}

// 사각형(Rectangle) 클래스: Shape 클래스를 상속받아 구현
class Rectangle extends Shape { 
    // 생성자: 가로(width), 세로(height) 값을 부모 클래스에 전달
    Rectangle(double width, double height) {
        super("사각형", width, height, 0);
    }
}

// 메인 클래스: 도형 객체를 생성하고 넓이와 둘레를 계산하여 출력
public class AbstractExample {
    public static void main(String[] args) {
        // 원 객체 생성 (반지름 5.0)
        Shape circle = new Circle(5.0);
        // 사각형 객체 생성 (가로 4.0, 세로 6.0)
        Shape rectangle = new Rectangle(4.0, 6.0);

        // 원 정보 출력
        circle.display();
        System.out.println("넓이: " + circle.calculateArea());
        System.out.println("둘레: " + circle.calculatePerimeter());

        System.out.println(); // 개행

        // 사각형 정보 출력
        rectangle.display();
        System.out.println("넓이: " + rectangle.calculateArea());
        System.out.println("둘레: " + rectangle.calculatePerimeter());
    }
}
