JAVA
[java] 다형성 Polymorphism
닉의네임
2025. 5. 14. 06:53
반응형
**다형성(Polymorphism)**은 객체 지향 프로그래밍(OOP)의 핵심 원칙 중 하나로, "하나의 인터페이스로 여러 가지 형태를 취할 수 있는 능력"을 의미합니다. 즉, 같은 타입의 객체라도 그 구현이 다르게 동작할 수 있게 해주는 특징입니다. 다형성은 주로 메소드 오버로딩(Method Overloading)과 메소드 오버라이딩(Method Overriding)을 통해 구현됩니다.
다형성의 종류
- 컴파일 시간 다형성 (정적 다형성) - 메소드 오버로딩과 연산자 오버로딩을 통해 구현됩니다.
- 런타임 다형성 (동적 다형성) - 메소드 오버라이딩을 통해 구현됩니다.
1. 메소드 오버로딩 (Method Overloading) - 컴파일 시간 다형성
메소드 오버로딩은 같은 이름의 메소드가 여러 가지 다른 파라미터 타입이나 개수를 받아서 동작할 수 있게 하는 것입니다. 메소드 오버로딩은 컴파일 시간에 어떤 메소드가 호출될지 결정됩니다.
예시:
class Calculator {
// 오버로딩된 add 메소드
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // int 타입, 8 출력
System.out.println(calc.add(5.5, 3.2)); // double 타입, 8.7 출력
}
}
- add(int a, int b)와 add(double a, double b)는 같은 이름을 가지지만 파라미터의 타입이 다르므로 오버로딩된 메소드입니다.
2. 메소드 오버라이딩 (Method Overriding) - 런타임 다형성
메소드 오버라이딩은 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 동적으로 동작을 다르게 만드는 것입니다. 오버라이딩은 런타임에 어떤 메소드가 호출될지 결정됩니다.
예시:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.makeSound(); // "Dog barks"
animal2.makeSound(); // "Cat meows"
}
}
- Dog와 Cat 클래스는 Animal 클래스의 makeSound() 메소드를 오버라이딩하여 각각 다른 동작을 수행합니다.
- Animal 타입의 변수에 Dog 또는 Cat 객체를 할당하고, 실제로 호출되는 메소드는 객체의 실제 타입에 따라 다르게 결정됩니다. 이처럼 메소드 호출 시 어떤 메소드가 호출될지 런타임에 결정되므로 런타임 다형성이라고 합니다.
다형성의 장점
- 유연성 증가: 다형성 덕분에 같은 코드로 다양한 형태의 객체를 처리할 수 있습니다. 예를 들어, Animal 타입의 변수로 Dog나 Cat 객체를 처리할 수 있습니다.
- 코드 재사용성 증가: 같은 메소드 이름을 사용하여 다양한 기능을 구현할 수 있어 코드의 중복을 줄이고, 재사용할 수 있습니다.
- 확장성: 새로운 클래스가 추가되더라도 기존 코드를 변경하지 않고도 새로운 기능을 확장할 수 있습니다. 예를 들어, 새로운 동물 클래스(Bird 등)를 추가하더라도 기존 코드는 변경할 필요 없이 동작합니다.
- 유지보수 용이: 다형성으로 인해 코드가 간결해지고, 추후 유지보수나 확장 시에 기존 코드와의 호환성 문제를 최소화할 수 있습니다.
결론
다형성은 동일한 인터페이스로 여러 가지 구현을 가능하게 하여 코드의 유연성과 확장성을 높여주는 중요한 개념입니다. 컴파일 시간 다형성과 런타임 다형성을 적절히 활용하면 더 효율적이고 유지보수가 용이한 시스템을 만들 수 있습니다.
반응형