동일한 이름의 메서드나 클래스가 서로 다른 형태로 동작할 수 있는 성질
다형성 덕분에 객체가 여러가지 형태를 가질 수 있어, 코드를 더 유연하고 확장성 있게 작성할 수 있다.
자바에서는 주로 상속, 인터페이스를 통해 다형성을 구현한다.
메서드 오버로딩(method overloading)으로 구현된다. 이는 같은 이름의 메서드가 다른 매개변수를 받아 동작하는 형태이다.
class Calculator {
// 두 정수를 더하는 메서드
public int add(int a, int b) {
return a + b;
}
// 세 정수를 더하는 메서드
public int add(int a, int b, int c) {
return a + b + c;
}
}
add라는 메서드는 같은 이름을 가지고 있지만, 서로 다른 매개변수로 호출되어 다르게 동작한다.
메서드 오버라이딩(method overriding)과 관련이 있다.
이는 상속관계에서 부모 클래스의 메서드를 자식 클래스가 재정의하여, 부모 타입의 참조 변수가 자식 객체를 가리킬 때, 자식 클래스의 메서드가 실행되는 방식이다.
class Animal {
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("개가 짖습니다.");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("고양이가 웁니다.");
}
}
Dog, Cat클래스는 Animal클래스를 상속받아 sound()메서드를 오버라이딩하고있다. 다형성을 통해 부모 타입인 Animal 참조 변수가 여러 자식 객체를 가리킬 수 있다.
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 개가 짖습니다.
myCat.sound(); // 고양이가 웁니다.
}
}