추상 클래스는 특정 메서드의 구현을 생략하고, 하위 클래스가 반드시 구현하도록 강제하는 클래스입니다. 아래 예제는 추상 클래스의 기본 구조를 보여줍니다.
public abstract class Vehicle {
public abstract void start();
public abstract void stop();
public void honk() {
System.out.println("비상 경보음이 울립니다.");
}
}
추상 메서드는 abstract 키워드로 선언되며, 본문(메서드 몸체)이 존재하지 않습니다. 이는 상속받은 구체적 하위 클래스에서 반드시 재정의되어야 함을 의미합니다. 또한, 추상 메서드는 정적 메서드나 생성자 내부에서는 사용할 수 없으며, private으로 선언될 수도 없습니다. 왜냐하면 private 접근 제어자는 하위 클래스에서 접근이 불가능하기 때문입니다.
추상 클래스의 주요 특징은 다음과 같습니다:
- 추상 메서드는 반드시
abstract키워드로 선언되어야 하며, 메서드 몸체가 없어야 합니다. - 추상 메서드는 반드시 추상 클래스 내에 정의되어야 합니다.
- 하위 클래스는 부모 클래스의 모든 추상 메서드를 오버라이드해야 합니다.
- 추상 클래스는 인스턴스화할 수 없으며,
new연산자를 사용해 객체를 생성할 수 없습니다. - 추상 클래스를 상속받는 클래스는 모든 추상 메서드를 구현하지 않으면, 다시 추상 클래스로 간주됩니다.
다음은 추상 클래스를 활용한 실습 예제입니다. 동물 기반 클래스인 Animal를 정의하고, 이를 상속받는 Dog 클래스에서 메서드를 구현합니다.
public abstract class Animal {
public abstract void feed();
public abstract void rest();
public void displayInfo() {
System.out.println("모든 동물은 생명을 유지합니다.");
}
}
class Dog extends Animal {
@Override
public void feed() {
System.out.println("개는 고기를 먹습니다.");
}
@Override
public void rest() {
System.out.println("개는 낮잠을 잡니다.");
}
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.feed();
myDog.rest();
myDog.displayInfo();
}
}
이처럼 추상 클래스는 공통적인 행동을 정의하고, 하위 클래스에서 구체적인 동작을 제공함으로써 코드의 재사용성과 확장성을 높입니다.