package CHAPTER06;

class Coffee {       // 부모 클래스: Coffee
	private String name;
	private String size;
	private int price;
	protected String type; // 자식 클래스에서 접근 가능

	public Coffee() { // 기본 생성자
		this("아메리카노", "Tall", 3000, "기본 커피");
	}

	// 오버로딩된 생성자 (name만 설정)
	public Coffee(String name) {
		this(name, "Tall", 3000, "기본 커피");
	}

	// 오버로딩된 생성자 (name, size 설정)
	public Coffee(String name, String size) {
		this(name, size, 3000, "기본 커피");
	}

	// 전체 매개변수를 받는 생성자
	public Coffee(String name, String size, int price, String type) {
		this.name = name;
		this.size = size;
		this.price = price;
		this.type = type;
	}

	// Getter 메서드 (캡슐화된 데이터 접근)
	public String getName() {
		return name;
	}

	public String getSize() {
		return size;
	}

	public int getPrice() {
		return price;
	}

	public String getType() {
		return type;
	}

	// Setter 메서드
	public void setPrice(int price) {
		if (price > 0) {
			this.price = price;
		}
	}

	public void printInfo() {
		System.out.println("이름: " + name + ", 사이즈: " + size + ", 가격: " + price + "원, 유형: " + type);
	}
}

// 자식 클래스: SpecialCoffee
class SpecialCoffee extends Coffee {
	private String specialIngredient;

	// 기본 생성자 (super() 사용)
	public SpecialCoffee() {
		super("바닐라 라떼", "Grande", 4500, "스페셜 커피"); // 부모 생성자 호출
		this.specialIngredient = "바닐라 시럽";
	}

	// 오버로딩된 생성자 (특수 재료 포함)
	public SpecialCoffee(String name, String size, int price, String specialIngredient) {
		super(name, size, price, "스페셜 커피"); // 부모 생성자 호출
		this.specialIngredient = specialIngredient;
	}

	// Getter 메서드
	public String getSpecialIngredient() {
		return specialIngredient;
	}

	@Override
	public void printInfo() {
		super.printInfo();
		System.out.println("  특수 재료: " + specialIngredient);
	}
}

public class LAB_02_CoffeeShop {
	public static void main(String[] args) {
		// 기본 커피 객체 생성
		Coffee defaultCoffee = new Coffee();
		defaultCoffee.printInfo();

		// 이름만 설정한 커피 객체 생성
		Coffee espresso = new Coffee("에스프레소");
		espresso.printInfo();

		// 이름과 크기 설정한 커피 객체 생성
		Coffee latte = new Coffee("카페라떼", "Grande");
		latte.printInfo();

		// 특수 커피 객체 생성
		SpecialCoffee vanillaLatte = new SpecialCoffee();
		vanillaLatte.printInfo();

		// 특정 스페셜 커피 생성
		SpecialCoffee caramelMacchiato = new SpecialCoffee("카라멜 마끼아또", "Venti", 5000, "카라멜 시럽");
		caramelMacchiato.printInfo();
	}
}