47.5 다형성 기법을 사용하여 프로그램 융통성 높이기
개체 지향 프로그래밍의 다형성을 사용하면 프로그램 융통성이 높아집니다. 여기서 융통성은 한 번 만들어 놓고 여러 경우에 대비해서 처리할 수 있는 기법을 제공한다는 것입니다. 이번에는 다형성을 사용해 보겠습니다. 다음 내용을 입력한 후 실행해 보세요.
다형성 기법 사용: PolymorphismDemo.cs
using System; namespace PolymorphismDemo { //① Animal 클래스: 추상 클래스 및 기본 클래스 public abstract class Animal { //동물들은 '울다'라는 기능이 있어야 한다고 명세 public abstract string Cry(); } //② Dog 클래스 public class Dog : Animal { public override string Cry() => "멍멍멍"; } //③ Cat 클래스 public class Cat : Animal { public override string Cry() => "야옹"; } //④ Trainer 클래스 public class Trainer { public void DoCry(Animal animal) { //뭐가 실행? Dog? Cat? => 모른다(컴파일 시점), //언제? 런타임에 Dog/Cat을 알 수 있음 Console.WriteLine("{0}", animal.Cry()); //다형성: dynamic(동적) } } class PolymorphismDemo { static void Main(string[] args) { //ⓐ 기본 개체 생성 방법 Console.WriteLine((new Dog()).Cry()); Console.WriteLine((new Cat()).Cry()); //ⓑ 부모 클래스 변수로 개체 생성 Animal dog = new dog(); Console.WriteLine(dog.Cry()); Animal cat = new Cat(); Console.WriteLine(cat.Cry()); //ⓒ 다형성 테스트: //동일한 Cry 메서드를 호출하지만, //넘겨준 메시지에 따라 서로 다른 유형의 기능 구현 //그러한 다형성은 메서드 오버라이드로 구현 Trainer trainer = new Trainer(); trainer.DoCry(new Dog()); trainer.DoCry(new Cat()); } } }
실행 결과
멍멍멍 야옹 멍멍멍 야옹 멍멍멍 야옹
①의 Animal 클래스는 다른 클래스의 부모 클래스 역할을 하는 추상 클래스로 만들었습니다. 추상 클래스 안에 정의된 추상 메서드는 따로 메서드 본문을 작성하지 않고 메서드에 대한 시그니처를 제공하는 목적이 큽니다. 인터페이스와 추상 클래스는 다른 클래스에 상속을 주어 특정 메서드를 구현하도록 강제하는 역할을 합니다.
④에서 Trainer 클래스의 DoCry() 메서드는 매개변수로 부모 클래스인 Animal 형식을 받습니다. 부모 클래스 형식으로 매개변수가 설정되면 자식 클래스의 인스턴스를 받을 수 있습니다. 이때 컴파일 시점에서는 어떤 클래스의 인스턴스가 넘어올지 모르므로 실제 코드는 동적으로 런타임할 때 어떤 Cry() 메서드가 실행될지 알 수 있습니다.
이러한 형태가 바로 다형성입니다. 다형성을 사용하면 이처럼 넘어오는 개체를 공통 형식으로 받지만, 해당 개체의 메서드를 호출할 수 있는 융통성이 생깁니다.