'폴리몰피즘(Polymorphism)'이란 말씀하신대로 객체지향 언어의 특징 중 하나입니다. '상속'이라는 특성으로 인해 나타날 수 있는 것인데 이해가 어렵습니다. 그래서 나름대로 이해하기 쉽게 예를 들어봤습니다.
우선 폴리몰피즘은 우리말로는 '다형성'이라고 표시되는데 자바에서는 다음과 같이 쓰입니다. A라는 클래스는 B라는 클래스의 부모 클래스라는 가정에서 시작합니다.
A a = new B();
이와 같은 것이 폴리몰피즘을 사용하는 방법입니다. 자바에는 두가지 변수 타입이 존재한다는 것은 아실 것입니다. 한가지는 '프리미티브 타입(Primitive Type)'이라고 하여 int, char 등 기본 8개 타입을 말합니다. 다른 한가지는 '참조 타입(Reference Type)'이라고 하여 프리미티브 타입을 제외한 모든 타입입니다. 흔히 쓰이는 String 클래스의 객체도 참조타입에 속합니다.
그런데 이 참조타입을 사용할 때는 반드시 new 키워드를 통해 생성을 해주어야 하는데 부모클래스의 타입으로 선언된 변수에 자식 타입의 객체를 할당하는 것을 폴리몰피즘이라고 합니다. 이렇게 선언된 위의 a 변수는 B클래스 타입으로 '타입 캐스팅(Type Casting)'이 되기 전에는 자식클래스인 B클래스의 고유한 메소드는 사용할 수 없습니다. 물론 A클래스의 메소드는 사용할 수 있습니다.
좀 유치하고 조잡한 예를 하나들어보겠습니다. 판타지 소설에 보면 '드래곤'이라던가 '리치'라는 몬스터들이 등장합니다. 모두 마법에 대해 극성까지 도달한 몬스터들로 이들은 모두 자신의 형체를 바꾸는 마법인 '폴리모프'라는 주문을 쓸 수 있는 자들입니다.
이들이 만약 '사람'의 모습으로 폴리모프 했다면 그들의 겉모습은 진짜 사람과 같지만 실제의 모습은 드래곤이나 리치라고 할 수 있습니다. 이들은 사람의 모습으로 폴리모프했기 때문에 사람의 모든 특성을 가지고 행동하지만 원래 드래곤이나 리치가 가지고 있던 고유의 특성인 '드래곤 브레스'라던지 '파멸의 오라'와 같은 능력은 본모습으로 돌아갈 때까지 사용할 수 없습니다.
이것으로 폴리몰피즘을 말해보면 '드래곤'이나 '리치'라는 클래스는 '사람'이라는 클래스의 자식클래스로 볼 수 있습니다. 사람이라는 클래스가 가지는 모든 특성을 가지고 거기다가 자신들만의 특수한 속성을 추가로 가지고 있기 때문입니다. 이를 자바식으로 표현해보면 다음과 같이 쓸 수 있습니다. 실제 사람까지 포함한다고 할 때,
사람 a = new 드래곤();
사람 b = new 리치();
사람 c = new 사람();
겉으로 봐서는 a나 b나 c나 겉으로 보면 다 같은 사람입니다. 하지만 a의 진정한 정체는 드래곤이며 b는 리치라고 할 수 있습니다. 이렇게 쓰는 이유는 사람의 모습을 하고 있으면 누구나 여관에서 묵을 수 있듯이 a, b, c는 모두 '사람'타입으로 선언된 배열에 담을 수 있습니다. 즉, 배열을 통한 관리가 용이해지는 것입니다.
a와 b는 사람과 같이 행동하지만 이 사람의 모습일 때는 자신이 본체의 모습일 때 사용할 수 있는 '드래곤 브레스'와 같은 고유의 메소드 사용이 불가합니다. 본체의 모습으로 돌아간다는 것은 '타입 캐스팅'이라 할 수 있습니다.
폴리몰피즘을 잘 사용하면 모든 종류의 변수를 한개의 배열에 담을 수도 있습니다. 자바의 모든 참조변수타입은 'Object' 클래스를 계승한 것이기 때문입니다. 답변이 되었기를 바라며 추가적인 질문에 대해서는 메일 주시기 바랍니다.