추상클래스
- 추상클래스의 용도 : 실체 클래스에 반드시 존재해야할 필드와 메소드의 선언(실체 클래스의 설계 규격)
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 :
멍멍
야옹
--------
멍멍
야옹
---------
멍멍
야옹