다형성
다형성(Polymorphism)은 *같은 메시지(메서드 호출)*가 받는 객체에 따라 다른 동작을 수행하도록 하는 객체지향 프로그래밍의 핵심 원리다. 그리스어 어원 그대로 “여러(Poly) 형태(Morph)“를 의미하며, 코드의 유연성과 재사용성을 높여 준다.
두 축
컴파일 타임 다형성: 오버로딩(Overloading)
같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 다르게 정의하는 방식이다.
int add(int a, int b)
double add(double a, double b)
int add(int a, int b, int c)호출 시점에 컴파일러가 적절한 버전을 선택한다.
런타임 다형성: 오버라이딩(Overriding)
부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 방식이다.
class Animal { void sound() { ... } }
class Dog extends Animal { void sound() { "멍멍" } }
class Cat extends Animal { void sound() { "야옹" } }
Animal a = new Dog();
a.sound(); // "멍멍" — 실제 객체 타입에 따라 동작왜 중요한가
- 변경에 강한 코드: 새 타입을 추가해도 기존 코드를 거의 안 바꿔도 된다.
- 추상화의 도구: 인터페이스에 의존하고 구현은 갈아끼울 수 있다.
- OCP(개방-폐쇄 원칙) 실현의 핵심 메커니즘.
관련 개념
| 용어 | 의미 |
|---|---|
| 상속(Inheritance) | 부모의 속성/행동을 물려받음 |
| 캡슐화(Encapsulation) | 데이터와 동작을 한 단위로 묶음 |
| 추상화(Abstraction) | 본질만 남기고 세부를 숨김 |