우리는 추상클래스를 같은 양식을 두고 보다 더 구체화하고 싶을 때 사용합니다.
예를 들어 '새' 라는 단어를 던져줍니다.
그러면 사람마다 각자 생각하는 새의 이미지, 새의 종류는 다를 것 입니다.
그렇기 때문에 우리는 '새' 라는 추상 클래스를 만들고 추상의 새가 우는 소리에 대한 birdSound( ) 라는 미완성 추상클래스를 만들어둡니다. 그리고 메서드를 미완성 시킨채로 부모로 상속시킵니다.
public abstract class Bird{
//uncomplete method
public abstract void birdSound();
// Normal method can also be in abstract class
public void feature(String bird){
System.out.println("The " + bird + " is cute.");
}
}
미완성 메소드를 완성시키는 것은 추상클래스를 상속받은 자녀 클래스입니다.
상속받은 자녀 각각 새에 대한 생각이 다르기 때문에 각자의 입맛대로 완성시킬 수 있습니다.
public class Duck extends Bird{
@Override
public void birdSound() {
System.out.println("꽥 꽥");
}
}
public class DuckExam {
public static void main(String[] args) {
String bird = "꽥꽥이";
Duck duck = new Duck();
duck.birdSound();
duck.feature(bird);
}
}

메서드가 하나라도 추상 메서드이면 클래스도 추상 클래스가 됩니다.
위의 class Bird 를 보면 알 수 있듯이 추상클래스 내부에는 일반 메서드도 구현 가능합니다.
추상클래스는 구체적이지 않기 때문에 상속 중 부모의 역할은 가능하나 객체를 생성할 수 는 없습니다.
아래 사진을 보면 Bird 객체가 생성되지 않고 오류가 뜨는 것을 확인 할 수 있습니다.

