다형성은 객체 지향 프로그래밍의 중요한 개념 중 하나입니다. 추상 클래스와 인터페이스를 사용하여 다형성을 활용하는 것은 객체 지향 프로그램을 더 유연하고 확장 가능하게 만드는 좋은 방법입니다.
추상 클래스와 인터페이스의 개요
추상 클래스는 일부 메서드가 구현되지 않은 미완성 클래스입니다. 추상 메서드를 포함할 수 있으며, 해당 클래스를 상속하는 서브 클래스에서는 추상 메서드를 반드시 구현해야 합니다.
인터페이스는 모든 메서드가 추상 메서드인 클래스와 비슷한 개념입니다. 클래스가 여러 개의 인터페이스를 구현할 수 있으며, 모든 인터페이스의 메서드를 구현해야 합니다.
실제 사례
다형성을 활용하는 실제 사례 중 하나는 동물을 다루는 프로그램입니다. 동물 클래스나 인터페이스를 만들고, 이를 상속받는 구체적인 동물 클래스를 만들어 다형성을 구현할 수 있습니다.
추상 클래스와 다형성
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void sound();
}
class Cat extends Animal {
public Cat(String name) {
super(name);
}
void sound() {
System.out.println(name + "는 야옹 소리를 낸다.");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
void sound() {
System.out.println(name + "는 멍멍 소리를 낸다.");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal cat = new Cat("야옹이");
Animal dog = new Dog("멍멍이");
cat.sound(); // 출력: 야옹이는 야옹 소리를 낸다.
dog.sound(); // 출력: 멍멍이는 멍멍 소리를 낸다.
}
}
위 예시에서 Animal
클래스는 추상 클래스로, sound()
메서드는 추상 메서드입니다. 이를 상속받은 Cat
클래스와 Dog
클래스에서는 sound()
메서드를 구현하여 각각의 동물 소리를 출력할 수 있습니다. Animal
클래스 타입으로 변수를 선언하고 서브 클래스의 객체를 생성하는 것은 다형성의 한 예입니다.
인터페이스와 다형성
interface Animal {
void sound();
}
class Cat implements Animal {
public void sound() {
System.out.println("야옹 소리를 낸다.");
}
}
class Dog implements Animal {
public void sound() {
System.out.println("멍멍 소리를 낸다.");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
cat.sound(); // 출력: 야옹 소리를 낸다.
dog.sound(); // 출력: 멍멍 소리를 낸다.
}
}
위 예시에서는 Animal
인터페이스를 정의하고, 이를 구현하는 Cat
클래스와 Dog
클래스를 만들었습니다. Animal
인터페이스를 구현한 클래스들은 모두 sound()
메서드를 구현해야 합니다. 마찬가지로 인터페이스 타입으로 변수를 선언하고 각각의 객체를 생성하는 것은 다형성의 한 예입니다.
결론
추상 클래스와 인터페이스를 사용하여 다형성을 활용하는 것은 객체 지향 프로그래밍에서 중요한 개념입니다. 이를 통해 소프트웨어를 유연하게 확장하고 재사용할 수 있으며, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.