[JAVA] 다형성
자바를 공부하다 보면 상속을 배우고 나서 꼭 등장하는 개념이 바로 다형성입니다. 처음에는 용어부터 어렵게 느껴졌고, 저도 솔직히 "이걸 왜 쓰는지" 잘 이해가 안 됐습니다. 하지만 직접 예제를 만들어보고 출력 결과를 확인하면서 조금씩 감이 잡히기 시작했습니다.
이 글은 다형성을 처음 접하는 입장에서, 코드 + 실행 결과(Output) 중심으로 정리한 글입니다.
1. 다형성이란?
다형성(Polymorphism)은 하나의 타입으로 여러 객체를 다룰 수 있는 성질을 말합니다. 자바에서는 보통 부모 클래스 타입으로 자식 객체를 참조하는 형태로 사용됩니다.
말로 보면 어려운데, 정리하면 아래 한 문장으로 이해할 수 있습니다.
부모 타입으로 참조해도, 실제 동작은 자식 객체 기준으로 실행된다.
2. 기본 예제로 이해하기
먼저 부모 클래스와 자식 클래스를 만들어보겠습니다.
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
이제 메인 메서드에서 객체를 생성해 실행해보겠습니다.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.sound();
animal2.sound();
}
}
실행 결과 (Output)
멍멍
야옹
변수 타입은 모두 Animal인데, 출력 결과는 각각 다르게 나옵니다. 이것이 바로 다형성입니다.
3. 왜 자식 메서드가 실행될까?
처음 공부할 때 가장 헷갈렸던 부분이 이거였습니다.
"Animal 타입인데 왜 Dog, Cat의 메서드가 실행될까?"
그 이유는 자바가 실행 시점(Runtime)에 실제 생성된 객체를 기준으로 메서드를 호출하기 때문입니다. 이를 동적 바인딩이라고 합니다.
즉, 변수 타입이 아니라 new로 생성된 객체가 중요합니다.
4. 다형성과 오버라이딩
다형성은 오버라이딩과 항상 함께 사용됩니다. 자식 클래스에서 부모 메서드를 재정의하지 않으면, 부모 클래스의 메서드가 그대로 실행됩니다.
Animal animal = new Animal();
animal.sound();
실행 결과 (Output)
동물이 소리를 냅니다.
오버라이딩이 있기 때문에 같은 메서드 호출이라도 결과가 달라질 수 있습니다.
5. 다형성을 사용하는 이유
처음에는 굳이 이렇게 써야 하나 싶었지만, 다형성의 장점은 코드가 커질수록 확실해집니다.
- 조건문(if, switch)이 줄어든다
- 기존 코드를 수정하지 않고 기능을 확장할 수 있다
- 코드가 유연해지고 읽기 쉬워진다
예를 들어 새로운 동물이 추가되어도, 기존 코드는 그대로 사용할 수 있습니다.
class Cow extends Animal {
@Override
void sound() {
System.out.println("음메");
}
}
6. 캐스팅과 주의할 점
부모 타입으로 참조하면 자식 클래스만의 메서드는 바로 사용할 수 없습니다.
Animal animal = new Dog();
animal.sound();
실행 결과 (Output)
멍멍
이 경우 자식 타입으로 형변환을 해야 합니다.
Dog dog = (Dog) animal;
dog.sound();
실행 결과 (Output)
멍멍
단, 실제 객체 타입이 다르면 ClassCastException이 발생하므로 무분별한 캐스팅은 주의해야 합니다.
7. 정리
다형성은 처음에는 어렵지만, 실무 코드에서는 거의 필수로 사용되는 개념입니다.
- 부모 타입으로 자식 객체를 참조한다
- 실행 시점에 실제 객체의 메서드가 호출된다
- 유지보수와 확장성에 큰 도움이 된다
아직 완벽하게 이해하지 못해도 괜찮다고 생각합니다. 저도 여러 번 직접 코드를 작성하고 출력 결과를 확인하면서 이해하게 되었습니다. 다형성은 손으로 쳐보면서 익히는 개념인 것 같습니다.
'Computer Science > Java' 카테고리의 다른 글
| [JAVA] 자바 예외 처리 완전 정리 (0) | 2026.03.15 |
|---|---|
| [Java] 자바 컬렉션 프레임워크 완전 정리 (0) | 2026.03.14 |
| [JAVA] 10 컬렉션(List / Set / Map)과 제네릭 (0) | 2026.02.15 |
| [JAVA] 08 객체지향(OOP) 4대 특징 (0) | 2026.02.15 |
| [JAVA] 07 클래스와 객체 (0) | 2026.02.15 |