공통되는 특성을 추출한 것
추상 클래스는 실체 클래스의 공통되는 필드와 메서드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다.
즉, new 연산자로 인스턴스를 생성하지 못한다.
또한 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다.
즉, extends 뒤에만 올 수 있는 클래스이다.
실체 클래스들의 공통적인 특성(필드, 메서드) 을 뽑아서 추상 클래스로 만드는 이유는?
실체 클래스들의 공통된 필드와 메서드의 이름을 통일할 목적.
동일한 데이터와 기능임에도 불구하고 이름이 다를경우 혼동이 올 수 있다.
실체 클래스를 작성할 때 시간을 절약
공통된 필드와 메서드는 추상 클래스에 모두 선언해 두고, 실체 클래스마다 다른 점만 선언하게 되면 시간을 절약할 수 있다.
추상 클래스를 선언할 때는 abstract 키워드를 붙여야 한다.
이렇게 하면 new 연산자를 이용해서 객체를 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있게 된다.
그렇지만, 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자는 필수.
예를들어 각각 동물의 소리를 나타내는 클래스들이 필요하다면
추상 클래스에 추상 메서드를 선언할 수 있다.
모든 동물은 소리를 내지만 각각 다른 소리를 내기 때문에
구체적인 소리는 실체 클래스에서 오버라이딩 해서 실행 내용을 작성하면 된다.
public | protected abstract 리턴타입 메서드명(매개변수, ...);
이 때, 자식 클래스는 추상 메서드를 무조건 재정의(오버라이딩) 해 줘야 한다.
ex)
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.prinltn("멍멍");
}
}
public Class AnimalExample {
public static void main(String[] args) {
animalSound(new Dog());
aniamlSound(new Cat());
}
public static void animalSound(Animal animal) {
animal.sound();
}
부모 타입의 매개 변수에 자식 객체를 대입하여 메서드의 다형성을 적용한 호출방식