실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스
추상클래스는 객체를 생성할 수 없다. 아직은 실체성이 없고 구체적이지 않기 때문이다.
추상클래스와 실체클래스는 상속관계이다
추상클래스 정의
public abstract class Animal {
public String kind;
public void breath(){
System.out.println("숨 쉰다.");
}
//추상메서드
public abstract void sound();//구체적인 구현부는 없다
}
/*
해당 추상클래스를 상속받는 실체클래스들은 반드시
sound()라는 추상메서드를 상속받아 재정의(오버라이딩)해야한다.
*/
// ------------------------------------------------------------------------------------
public class Dog extends Animal{
public Dog(){
this.kind = "포유류";
}
@Override
public void sound() { //sound() 추상메서드를 오버라이딩해서 구현
System.out.println("왈왈!");
}
}
// ------------------------------------------------------------------------------------
public class Cat extends Animal{
public Cat(){
this.kind = "포유류";
}
@Override
public void sound() {
// Dog와 같지만 sound() 추상메서드는 Cat실체클래스에 맞게끔 자기스타일대로 구현
System.out.println("야옹!");
}
}
추상클래스 변수에, 추상클래스를 상속받아 구현한 실체클래스 인스턴스를 주입하면 해당 추상클래스 변수는 자동 타입변환을 발생시켜 실체클래스 인스턴스처럼 사용할 수 있다
public class AnimalExample {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound();
cat.sound();
Animal animal = null;
animal = new Dog(); //자동 타입변환
animal.sound(); //Dog에 구현된 Sound()메서드 실행
animal = new Cat(); //자동 타입변환
animal.sound(); //Cat에 구현된 Sound()메서드 실행
animalSound(new Dog()); //자동 타입변환 (매개변수도 가능)
animalSound(new Cat()); //자동 타입변환 (매개변수도 가능)
}
private static void animalSound(Animal animal) {
animal.sound();
}
//자동 타입변환 : 추상클래스 타입 변수는 추상클래스를
//상속받은 실체클래스의 타입으로 자동 타입변환이 된다.
}