728x90
반응형
아래 예로 살펴보자.
abstract class Animal // Base class (parent)
{
// Abstract method (does not have a body)
public abstract void animalSound ();
}
class Pig : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class AllAnimal
{
public List<Animal> animals { get; set; }
public AllAnimal()
{
animals = new List<Animal>();
}
public void AddAnimal(Animal animal)
{
animals.Add(animal);
}
public void PrintList()
{
foreach (Animal animal in animals)
{
animal.animalSound();
}
}
}
class Program
{
static void Main(string[] args)
{
AllAnimal allAnimal = new AllAnimal(); // Create a Pig object
allAnimal.AddAnimal(new Pig());
allAnimal.AddAnimal(new Dog());
allAnimal.PrintList();
// output
// The pig says: wee wee
// The dog says: bow wow
}
}
1. 코드 독립성
새로운 Derived Animal class(예를들면 cat...)가 추가되는 경우에도, AllAnimal class는 Animal class의 참조만 handle하므로, 소스를 수정할 필요가 없다. 특정 Animal class와 독립적이므로, 코드 관리가 용이하다.
2. 하나의 list에 여러 type의 objects를 저장할 수 있다.
다형성이 없었다면, 우리는 동물 개별 list를 관리해야 한다. 다형성을 사용하므로, 같은 list에 모든 animal type을 저장할 수 있다.
3. 동일한 함수에 여러 type의 objects를 전달할 수 있다.
AddAnimal()함수는 모든 타입의 animals를 input arguments로 전달받을 수 있다. 매개변수 type을 Animal base type으로 지정해야 한다.
다형성이 없었다면, animal별로 2개의 AddAnimal()함수를 지정하고, 새로운 Derived Animal class가 추가되면 그에따라 AddAnimal()함수를 추가해야 한다.
4. switch/case (or if/ekse) block, typeof operator 사용을 피할 수 있다.
다형성이 없다면, 아래와 같은 단순한 형태의 class를 사용해야 한다. Animal의 type을 알려주는 Type member variable을 포함하고, if-else block을 관리해야 한다. 새로운 type의 Animal이 추가될때마다, animalSound()함수가 수정되어야 한다.
class Animal
{
public string Type { get; set; }
public void animalSound()
{
if (Type == "Pig")
Console.WriteLine("The pig says: wee wee");
if (Type == "Dog")
Console.WriteLine("The pig says: wee wee");
}
}
728x90
반응형
'C#' 카테고리의 다른 글
C#] Polymorphic Serialization and Deserialization with System.Text.Json (0) | 2022.08.10 |
---|---|
C#] System.Text.Json vs Newtonsoft.Json 차이점 비교 (0) | 2022.07.28 |
C#] Inheritance, Polymorphism, Abstraction, Interface (0) | 2022.07.21 |
C#] LINQ - Projection (0) | 2022.07.20 |
C#] 반복자(Iterator), yield keyword (0) | 2022.07.19 |
댓글