자바의 다형성
자바의 다형성(Polymorphism)은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 여러 클래스 또는 인터페이스의 객체가 동일한 인터페이스를 충족하면서 서로 다른 동작을 수행할 수 있게 하는 기능입니다. 다형성을 통해 코드의 유연성과 확장성을 높일 수 있습니다. 이번 글에서는 자바의 다형성에 대해 더 자세히 알아보고, 예제 코드를 통해 기능을 이해해 보겠습니다.
1. 다형성의 개념 및 장점
다형성의 가장 큰 장점은 다양한 객체를 같은 타입으로 처리할 수 있다는 것입니다. 즉, 여러 클래스가 동일한 메서드를 구현하는 인터페이스를 가지면, 이 클래스들의 객체를 동일한 참조 변수로 처리할 수 있을 뿐만 아니라 동일한 인터페이스를 통해 메서드를 호출할 수 있습니다. 이는 코드의 유연성을 높이고, 확장성을 증가시키는 것을 가능하게 하는데, 이로 인해 다음과 같은 장점이 발생합니다.
- 코드의 재사용성이 높아집니다. 같은 인터페이스를 여러 객체로 구현하고 보다 쉽게 대체하여 사용할 수 있기 때문입니다.
- 중복 코드를 줄일 수 있습니다. 새로운 구현을 간단하게 추가할 수 있으며, 기존 코드는 건드릴 필요가 없어집니다.
- 유지 보수가 쉬워집니다. 기존 코드를 수정하거나 기능을 추가할 때, 다만 필요한 곳에 손을 대면 됩니다.
2. 자바 다형성 구현 및 사용
자바에서 다형성을 구현하기 위해서는 다음과 같은 방법들을 사용할 수 있습니다.
- 추상 클래스(Abstract Class)와 인터페이스(Interface) 사용
- 메서드 오버로딩(Method Overloading)
- 메서드 오버라이딩(Method Overriding)
예제로 설명하면 아래와 같습니다.
// 인터페이스 정의
interface Animal {
void speak(); // 모든 동물이 구현해야 하는 공통 메서드
}
// 인터페이스를 구현하는 클래스 정의
class Dog implements Animal {
@Override
public void speak() {
System.out.println("멍멍!");
}
}
class Cat implements Animal {
@Override
public void speak() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog(); // 다형성에 의해 Dog를 Animal로 할당
Animal myCat = new Cat(); // 다형성에 의해 Cat를 Animal로 할당
myDog.speak(); // "멍멍!"
myCat.speak(); // "야옹!"
}
}
위의 예제에서 Animal은 공통 인터페이스이며, Dog와 Cat은 서로 다른 클래스지만 Animal 인터페이스를 구현합니다. 이를 통해, 새로운 동물 클래스를 추가할 때 기존 코드를 수정하지 않고 간단하게 애플리케이션에 새로운 기능을 추가할 수 있습니다.
3. 다형성 예제
자동차를 나타내는 추상 클래스를 정의하고, 여러 종류의 엔진을 가진 자동차 클래스를 구현해보겠습니다. 이 예제에서 해당 추상 클래스는 여러 엔진의 종류에 따라 Engine 인터페이스를 다르게 구현하여 클래스를 생성할 것입니다.
// 추상 클래스 정의
abstract class AbstractCar {
void startEngine() {
System.out.println("자동차 엔진을 켭니다.");
}
}
// 인터페이스 정의
interface Engine {
void run();
}
// 인터페이스를 구현하는 클래스 정의
class GasolineEngine implements Engine {
@Override
public void run() {
System.out.println("가솔린 엔진이 작동합니다.");
}
}
class ElectricEngine implements Engine {
@Override
public void run() {
System.out.println("전기 엔진이 작동합니다.");
}
}
class Car extends AbstractCar {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
@Override
void startEngine() {
super.startEngine();
this.engine.run(); // 엔진 종류에 따라 다른 동작 수행
}
}
public class Main {
public static void main(String[] args) {
Car gasCar = new Car(new GasolineEngine());
Car electricCar = new Car(new ElectricEngine());
gasCar.startEngine(); // 가솔린 엔진이 작동합니다.
electricCar.startEngine(); // 전기 엔진이 작동합니다.
}
}
자바 다형성을 통해 프로젝트의 규모가 커져도 코드의 유연성과 확장성을 향상시킬 수 있으며, 효율적인 협업이 가능해집니다.