Java의 추상 클래스는 객체 지향 프로그래밍에서 중요한 역할을 하는 구조적 요소입니다. 추상 클래스는 클래스의 공통적인 요소를 선언하고, 실제 구현은 이를 상속받은 하위 클래스에서 정의하도록 강제합니다. 이러한 방식은 이 코드의 재사용성과 확장성을 높이는 데 기여합니다. 추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있으며, 이러한 메서드는 반드시 하위 클래스에서 구현되어야 합니다.
```java
abstract class Animal {
abstract void makeSound();
void breathe() {
System.out.println("Breathing...");
}
}
```
위의 예에서는 `Animal`이라는 추상 클래스를 정의하고 있습니다. `makeSound()`는 추상 메서드로, 이 메서드는 `Animal` 클래스를 상속받는 모든 하위 클래스에서 구현해야 합니다. `breathe()` 메서드는 일반 메서드로 하위 클래스에서 재사용 가능합니다.
사례로, 각 동물별 소리를 출력하는 프로그램을 만든다고 가정해봅시다. 아래는 추상 클래스를 활용한 예제입니다.
```java
class Dog extends Animal {
void makeSound() {
System.out.println("Woof! Woof!");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("Meow! Meow!");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // "Woof! Woof!" 출력
myCat.makeSound(); // "Meow! Meow!" 출력
myDog.breathe(); // "Breathing..." 출력
}
}
```
위의 `Dog`와 `Cat` 클래스는 각각 `Animal`의 하위 클래스이며, `makeSound()` 메서드를 구체적으로 구현하고 있습니다. `Main` 클래스에서는 `Animal` 타입으로 `Dog`와 `Cat` 객체를 각각 생성하고, 구현된 `makeSound()`를 호출하여 각 동물의 소리를 출력합니다.
추상 클래스는 특정 필수 메서드들의 구현을 강제함으로써, 일관성 있는 인터페이스를 제공하는 데 매우 유용합니다. 이를 통해 다양한 클래스들이 공통 그룹으로 취급될 수 있고, 코드의 가독성과 유지보수성이 향상됩니다.