C#/클래스와 객체지향
C# 클래스와 객체지향 - 11. 다형성
tita
2024. 5. 28. 17:15
상속을 사용해 클래스 구현 부분의 코드 중복을 해결했습니다. 이제 Main() 메서드를 살펴보면 여기에도 코드가 중복되는 것을 볼 수 있습니다.
class Animal
{
public int Age { get; set; }
public Animal() { this.Age = 0; }
public void Eat(); { Console.WriteLine("먹습니다"); }
public void Sleep(); { Console.WriteLine("잡니다"); }
}
class Dog : Animal // Animal 클래스의 상속을 받습니다.
{
public stirng Color { get; set; }
public void Bark() { Console.WriteLine("짖습니다"); }
}
class Cat : Animal // Animal 클래스의 상속을 받습니다.
{
public void Meow() { Console.WriteLine("냥냥 웁니다"); }
}
static void Main(string[] args)
{
// 비슷한 코드 중복
List<Dog> Dogs = new List<Dog>() { new Dog(), new Dog(), new Dog() };
List<Cat> Cats = new List<Cat>() { new Cat(), new Cat(), new Cat() };
// 비슷한 코드 중복
foreach(var item in Dogs)
{
item.Eat();
item.Sleep();
item.Bark();
}
foreach(var item in Cats)
{
item.Eat();
item.Sleep();
item.Meow();
}
}
이럴 때 코드 중복을 해결할 수 있는 것이 다형성입니다. 다형성은 하나의 클래스가 여러 형태로 변환될 수 있는 성질이라고 정의합니다.
쉽게 말해서 자식 클래스가 부모 클래스로 위장하는 것으로 알아두면 편합니다.
Animal dog = new Dog();
Animal cat = new Cat();
이러면 변수 dog는 외관상으로 자료형이 Animal 이지만 실제 내부에는 Dog가 들어있습니다.
물론 외관상으로 Animal 이기 때문에 Dog의 멤버는 사용이 불가능합니다.
즉, 부모로 위장한 자식은 부모의 멤버만 사용 가능합니다.
코드 중복을 제거한 코드를 살펴보겠습니다.
static void Main(string[] args)
{
// 하나의 리스트를 사용합니다.
List<Animal> Animals = new List<Animal>()
{
new Dog(), new Cat(), new Cat(), new Dog(),
new Cat(), new Dog(), new Dog(), new Dog()
};
// 하나의 반복문만 사용합니다.
foreach(var item in Animals)
{
item.Eat();
item.Sleep();
}
}
이런식으로 코드를 간소화 할 수 있습니다.