추상(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(); // 재정의된 메소드 호출
}
}
👀책 <혼공자>를 참고하여 작성하였습니다 :)