다형성은 하나의 객체가 여러 유형으로 사용될 수 있다는 개념이에요. 자바에서는 상속을 기반으로 동작하며, 부모 클래스로 선언된 변수에 자식 클래스의 인스턴스를 할당할 수 있습니다. 이를 활용하면 코드의 재사용성과 유지보수성이 높아지고, 다양한 객체를 유연하게 사용할 수 있습니다.
비유: 부모 클래스를 "컵"이라고 생각해 봅시다. 컵은 "물"도, "주스"도, "커피"도 담을 수 있죠. 컵이 어떤 종류의 액체를 담고 있든지 컵으로써의 기능(잡고 마시는 기능)은 변하지 않습니다.
마찬가지로
Person타입의 변수는Student,Teacher,Employee객체를 담을 수 있습니다. 하지만Person의 기능을 따르는 방식으로 사용됩니다.
코드 예시
Person p; // p는 Person 타입이므로 하위 객체를 담을 수 있음
p = new Student("허현수", 17, "20160001");
p = new Teacher("허현준", 22, "Java Programming");
p = new Employee("허현정", 23, "교무처");
비유: 부모 클래스는 "TV 리모컨"이고, 자식 클래스는 "TV 기기"라고 생각해 봅시다.
리모컨으로 TV를 조작하면, 어떤 TV를 연결했느냐에 따라 TV의 화면이 달라지는 것처럼
자식 객체가 부모 변수에 저장되었을 때 부모가 가진 메서드를 자식이 재정의하면, 실행 시 자식 클래스의 메서드가 호출됩니다.
코드 예시
Person p = new Student("허현수", 17, "20160001");
System.out.println(p.getDetails()); // Student의 getDetails() 실행됨!
p = new Teacher("허현준", 22, "Java Programming");
System.out.println(p.getDetails()); // Teacher의 getDetails() 실행됨!
텍스트 그림
메모리 구조 (Virtual Method Invocation)
Person p 참조 변수 (Stack)
┌──────────────────────────┐
│ 참조값 → Student 객체 │
└──────────────────────────┘
Heap 메모리
┌──────────────────────────┐
│ Student 객체 │
│ getDetails() 재정의됨 │ <-- 호출
└──────────────────────────┘
비유: 다양한 종류의 물건을 담을 수 있는 "가방"이라고 생각해 봅시다.
보통 "가방" 안에는 책, 연필, 노트 같은 같은 종류의 물건이 들어갑니다. 하지만 가방을 범용적으로 만든다면 책, 연필뿐만 아니라 노트북, 물통, 간식도 넣을 수 있죠!
즉,
Person[]배열도 원래는Person객체만 담을 수 있지만, 다형성을 이용하면 다양한 객체를 담을 수 있습니다!
코드 예시