package CHAPTER07;

//추상 클래스 Pet: 공통 속성과 동작 정의, 특정 동작은 추상 메서드로 선언
abstract class Pet {
	protected String name; // 반려동물의 이름 (상속 클래스에서 접근 가능)
	protected int age; // 반려동물의 나이

	// 생성자: 이름과 나이를 초기화
	public Pet(String name, int age) {
		this.name = name;
		this.age = age;
	}

	// 공통 동작 메서드 (모든 반려동물이 공유)
	public void eat() {
		System.out.println(name + "이(가) 먹이를 먹고 있습니다.");
	}

	public void sleep() {
		System.out.println(name + "이(가) 잠을 자고 있습니다.");
	}

	// 반드시 자식 클래스에서 구현해야 하는 추상 메서드
	public abstract void makeSound();

	// 선택 동작: 필요에 따라 자식 클래스에서 오버라이딩 가능
	public void walk() {}

	public void swim() {}

	// 반려동물 기본 정보 출력
	public void displayInfo() {
		System.out.println("반려동물: " + name + ", 나이: " + age);
	}
}

//Bird 클래스: Pet을 상속받아 새의 특징 구현
class Bird1 extends Pet {
	public Bird1(String name, int age) {
		super(name, age); // 부모 클래스 Pet의 생성자 호출
	}

	// 추상 메서드 오버라이딩: 새의 울음소리 구현
	@Override
	public void makeSound() {
		System.out.println(name + "이(가) 지저귑니다. (짹짹!)");
	}

	// 선택 동작 오버라이딩: 새의 걸음걸이 구현
	@Override
	public void walk() {
		System.out.println(name + "이(가) 종종걸음으로 다닙니다.");
	}

	// Bird 클래스 전용 메서드: 나는 기능
	public void fly() {
		System.out.println(name + "이(가) 하늘을 납니다.");
	}
}

//Fish 클래스: Pet을 상속받아 물고기의 특징 구현
class Fish extends Pet {
	public Fish(String name, int age) {
		super(name, age); // 부모 클래스 Pet의 생성자 호출
	}

	// 추상 메서드 오버라이딩: 물고기는 소리를 내지 않음
	@Override
	public void makeSound() {
		System.out.println(name + "은(는) 소리를 내지 않습니다.");
	}

	// 선택 동작 오버라이딩: 물고기의 수영 동작 구현
	@Override
	public void swim() {
		System.out.println(name + "이(가) 물속에서 헤엄칩니다.");
	}
}

//실행 클래스
public class LAB_02_PetSimulation {
	public static void main(String[] args) {
		// 업캐스팅: Bird와 Fish 객체를 Pet 타입으로 참조
		Pet bird = new Bird1("앵무새", 2);
		Pet fish = new Fish("금붕어", 1);

		// Bird 객체 동작
		bird.displayInfo(); // 공통 메서드
		bird.eat(); // 공통 메서드
		bird.makeSound(); // Bird에서 오버라이딩된 메서드 실행
		bird.walk(); // Bird에서 오버라이딩된 메서드 실행
		((Bird1) bird).fly(); // 다운캐스팅: Bird 전용 메서드 호출
		bird.sleep(); // 공통 메서드

		System.out.println();

		// Fish 객체 동작
		fish.displayInfo(); // 공통 메서드
		fish.eat(); // 공통 메서드
		fish.makeSound(); // Fish에서 오버라이딩된 메서드 실행
		fish.swim(); // Fish에서 오버라이딩된 메서드 실행
		fish.sleep(); // 공통 메서드
	}
}
