package CHAPTER06;

class Car {
	private final String model; // 모델명 (변경 불가능)
	private final double tankCapacity; // 연료 탱크 용량 (리터)
	private double distanceDriven; // 주행 거리 (km)

	// static 변수: 전체 등록된 차량 개수 추적
	private static int totalCars = 0;

	public Car(String model, double tankCapacity) {
		this.model = model;
		this.tankCapacity = tankCapacity;
		this.distanceDriven = 0;
		totalCars++;
	}

	// 연비 계산 (자식 클래스에서 오버라이딩할 메서드)
	public double calculateFuelEfficiency() {
		return 0; // 기본값 (오버라이딩 필수)
	}

	// 연료 소비량 계산 (final: 오버라이딩 금지)
	public final double fuelConsumed() {
		return distanceDriven / calculateFuelEfficiency();
	}

	// 주행 거리 추가
	public void drive(double distance) {
		this.distanceDriven += distance;
	}

	public void displayInfo() {
		System.out.println("모델명: " + model);
		System.out.println("탱크 용량: " + tankCapacity + "L");
		System.out.println("총 주행 거리: " + distanceDriven + "km");
		System.out.println("평균 연비: " + calculateFuelEfficiency() + " km/L");
		System.out.println("소모된 연료량: " + fuelConsumed() + "L");
		System.out.println("-----------------------------------");
	}

	// static 메서드: 전체 등록된 차량 개수 출력
	public static void displayTotalCars() {
		System.out.println("총 등록된 차량 개수: " + totalCars);
	}

	// 객체 소멸 시 메시지 출력 (GC 동작 확인)
	@Override
	protected void finalize() throws Throwable {
		System.out.println(model + " 차량 객체가 가비지 컬렉션에 의해 제거되었습니다.");
		totalCars--;
	}
}

class GasolineCar extends Car { // 자식 클래스 1: 가솔린 자동차
	private final double fuelEfficiency; // 연비 (km/L)

	public GasolineCar(String model, double tankCapacity, double fuelEfficiency) {
		super(model, tankCapacity);
		this.fuelEfficiency = fuelEfficiency;
	}

	// 연비 계산 (오버라이딩)
	@Override
	public double calculateFuelEfficiency() {
		return fuelEfficiency;
	}
}

class DieselCar extends Car { // 자식 클래스 2: 디젤 자동차
	private final double fuelEfficiency;

	public DieselCar(String model, double tankCapacity, double fuelEfficiency) {
		super(model, tankCapacity);
		this.fuelEfficiency = fuelEfficiency;
	}

	// 연비 계산 (오버라이딩)
	@Override
	public double calculateFuelEfficiency() {
		return fuelEfficiency;
	}
}

public class LAB_03_FuelEfficiencyCalculator {
	public static void main(String[] args) {
		GasolineCar camry = new GasolineCar("Toyota Camry", 50, 12);
		DieselCar santaFe = new DieselCar("Hyundai Santa Fe", 60, 15);

		// 주행 후 연비 계산
		camry.drive(240); // Toyota Camry 주행 (240km)
		santaFe.drive(300); // Hyundai Santa Fe 주행 (300km)

		camry.displayInfo();
		santaFe.displayInfo();

		Car.displayTotalCars(); // 전체 등록된 차량 개수 출력

		// 객체 삭제 및 GC 강제 실행 (메모리 회수 확인)
		camry = null;
		santaFe = null;
		System.gc();
	}
}