추상(abstract)는 실체 간에 공통되는 특성을 추출한 것이다.
실체 클래스 설계시 분업 작업을 할 때, 개발자마다 동일한 기능을 모두 다른 이름으로 작성할 때 객체마다 사용 방법이 다름을 방지하기 위해서 공통된 필드와 메소드 이름을 통일한다.
공통 필드와 메소드는 추상클래스로 작성해두면 실체 클래스를 작성하는 데 시간을 절약할 수 있다.
public abstract class 클래스 {
// 필드
// 생성자
// 메소드
}
추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해놓은 것으로, 실체 클래스의 멤버(필드, 메소드)를 통일하는 데 목적이 있다. 모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋다.
BUT,
추상 클래스 설계 시 하위 클래스가 반드시 실행해야 할 메소드가 있을 때 해당 메소드를 추상 메소드로 선언한다. 그리고 추상 클래스를 상속받고, 추상 메소드를 작성하지 않으면 컴파일 에러가 발생한다.
다음은 Animal 클래스를 추상 클래스로 선언하고, 동물은 소리를 낸다는 공통적인 특징을 규정하기 위해 sound() 메소드를 추상 메소드로 선언한 것이다.
// Animal.java
public abstract class Animal { // 추상 클래스
public String kind;
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound(); // 추상 메소드
}
// Dog.java
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
@Override
public void sound() {
System.out.println("멍멍"); // 추상 메소드 재정의
}
}
// AnimalExample.java
public class AnimalExample {
public static void main(String[] arg) {
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(); // 재정의된 메소드 호출
}
}
👀책 <혼공자>를 참고하여 작성하였습니다 :)