추상클래스

- 추상클래스의 용도 : 실체 클래스에 반드시 존재해야할 필드와 메소드의 선언(실체 클래스의 설계 규격)
public abstract class Vehicle {
//실제로 vehicle에 있는 run은 필요 없다 단지 bus와 taxi가 재정의 해서 쓰이기 위한 뼈대일뿐
//그래서 abstract를 안하면 run() {이 괄호안에 쓸때 없는 출력 안해도 되는걸 넣어야 하는데}
//그러한 쓸데없는 행동을 없애기 위해서 규격으로만 설정하려고 run메소드에 abstract를
//붙이지만 이걸 이용할려면 해당 클래스에도 abstract 붙여야함  
// abstract를 쓰는 메소드는 {} 필요없다.
	public abstract void run();  
}

---------------------------------------
public class Driver {
	//매개변수의 다형성으로 해당 매개변수에 들어올 객체는 같은 클래스이거나 상속받은 하위클래스 이어야함
	public void drive(Vehicle vehicle) {
		vehicle.run();
	}
}

----------------------------
public class Bus extends Vehicle{

	@Override
	public void run() {
		System.out.println("버스가 달립니다.");
	}
	
}
--------------------------------
public class Taxi extends Vehicle{

	@Override
	public void run() {
		System.out.println("택시가 달립니다.");
	}
}
--------------------------------------------
public class DriverExample {

	public static void main(String[] args) {
		Driver driver = new Driver();
		//Bus bus = new Bus();
		Taxi taxi = new Taxi();
		
//실제로는 밑에 버스처럼 따로 변수에 생성하지않고 바로 넣는 버릇 들여라
		driver.drive(new Bus());  //자동타입 변환: Vehicle vehicle = bus;
		driver.drive(taxi); //자동타입 변환: Vehicle vehicle = taxi;

	}

}

result : 버스가 달립니다.
				 택시가 달립니다.
//추상클래스
public abstract class Animal {
	public String kind;
	
	public void breathe() {
		System.out.println("숨을 쉽니다.");
	}
	
	public abstract void sound(); //추상 메소드
}
------------------------------------------
public class Dog extends Animal {
	public Dog() {
		this.kind = "포유류";
	}

	//추상 메소드 재정의
	@Override
	public void sound() {
		System.out.println("멍멍");   
	}
	
	
}
--------------------------------------------
public class Cat extends Animal{
	public Cat() {
		this.kind = "포유류";
	}

	//추상 메소드 재정의
	@Override
	public void sound() {
		System.out.println("야옹");
	}

}
------------------------------------------------
public class AnimalExample {

	public static void main(String[] args) {
		Dog dog = new Dog();
		Cat cat = new Cat();
		dog.sound();
		cat.sound();
		System.out.println("--------");
		
		//변수의 자동 타입 변환
		Animal animal = null;
		animal = new Dog();    //자동 타입 변환 및 재정의된 메소드 호출
		animal.sound();
		
		animal = new Cat();    //자동 타입 변환 및 재정의된 메소드 호출
		animal.sound();
		System.out.println("---------");
		
		//메소드의 다형성
		animalSound(new Dog()); //자동타입변환
		animalSound(new Cat()); //자동타입변환

	}
	
	public static void animalSound(Animal animal) {
		animal.sound(); //재정의된 메소드 호출
	}
}
--------------------------------------------
result :

멍멍
야옹
--------
멍멍
야옹
---------
멍멍
야옹