객체지향 프로그래밍


4. 다형성 (Polymorphism)

다형성은 하나의 객체가 여러 유형으로 사용될 수 있다는 개념이에요. 자바에서는 상속을 기반으로 동작하며, 부모 클래스로 선언된 변수에 자식 클래스의 인스턴스를 할당할 수 있습니다. 이를 활용하면 코드의 재사용성과 유지보수성이 높아지고, 다양한 객체를 유연하게 사용할 수 있습니다.


4.1 다형적 객체

비유: 부모 클래스를 "컵"이라고 생각해 봅시다. 컵은 "물"도, "주스"도, "커피"도 담을 수 있죠. 컵이 어떤 종류의 액체를 담고 있든지 컵으로써의 기능(잡고 마시는 기능)은 변하지 않습니다.

마찬가지로 Person 타입의 변수는 Student, Teacher, Employee 객체를 담을 수 있습니다. 하지만 Person의 기능을 따르는 방식으로 사용됩니다.

코드 예시

Person p; // p는 Person 타입이므로 하위 객체를 담을 수 있음
p = new Student("허현수", 17, "20160001");
p = new Teacher("허현준", 22, "Java Programming");
p = new Employee("허현정", 23, "교무처");


4.2 Virtual Method Invocation (가상 메서드 호출)

비유: 부모 클래스는 "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() 재정의됨    │ <-- 호출
                 └──────────────────────────┘


4.3 이종 모음 (Heterogeneous Collection)

비유: 다양한 종류의 물건을 담을 수 있는 "가방"이라고 생각해 봅시다.

보통 "가방" 안에는 책, 연필, 노트 같은 같은 종류의 물건이 들어갑니다. 하지만 가방을 범용적으로 만든다면 책, 연필뿐만 아니라 노트북, 물통, 간식도 넣을 수 있죠!

즉, Person[] 배열도 원래는 Person 객체만 담을 수 있지만, 다형성을 이용하면 다양한 객체를 담을 수 있습니다!

코드 예시