C# 에서 클래스의 상속 관계를 정의할 때, virtual 와 override 를 이용해 함수를 구현하는 경우가 종종 있습니다. 이것은 클래스의 다형성을 활용하기 위한 방법입니다.
다형성 (Polymorphism) 이란?
다형성은 "하나의 타입으로 여러 가지 형태를 다룰 수 있는 성질" 을 의미합니다.
한자로는 多形性, 즉 "여러 개의 형태를 가진 성질" 이라는 뜻이고,
영어로는 Polymorphism (poly = 여러, morph = 형태)입니다.
프로그래밍에서 하나의 부모를 상속받은 여러 개의 자식 클래스가 있을 경우, 어떤 자식으로 인스턴스를 생성했느냐에 따라 부모가 각각의 자식 형태로 모습을 띄게 되는 것을 말합니다.
기본 개념
1. 부모 클래스는 virtual로 메서드를 정의
2. 자식 클래스는 override로 해당 함수를 재정의
3. 객체는 자식 클래스로 생성
4. 참조는 부모 타입으로 선언
예제 1 :
class Pizza
{
public virtual void Bake()
{
Console.WriteLine("기본 피자를 굽습니다.");
}
}
class CheesePizza : Pizza
{
public override void Bake()
{
Console.WriteLine("치즈 피자를 굽습니다!");
}
}
class PepperoniPizza : Pizza
{
public override void Bake()
{
Console.WriteLine("페퍼로니 피자를 굽습니다!");
}
}
List<Pizza> orders = new List<Pizza>();
orders.Add(new CheesePizza());
orders.Add(new PepperoniPizza());
orders.Add(new Pizza());
foreach (var pizza in orders)
{
pizza.Bake(); // 각각 다른 클래스의 Bake()가 실행됨
}
// 출력 :
치즈 피자를 굽습니다!
페퍼로니 피자를 굽습니다!
기본 피자를 굽습니다.
예제 2 :
class Item
{
public virtual void Use()
{
Console.WriteLine("아이템을 사용합니다.");
}
}
class Potion : Item
{
public override void Use()
{
Console.WriteLine("체력을 회복합니다!");
}
}
class Bomb : Item
{
public override void Use()
{
Console.WriteLine("폭발! 적에게 피해를 줍니다!");
}
}
List<Item> inventory = new List<Item>();
inventory.Add(new Potion());
inventory.Add(new Bomb());
inventory.Add(new Item());
foreach (var item in inventory)
{
item.Use(); // 각각 다른 클래스의 Use()가 실행됨
}
// 출력 :
체력을 회복합니다!
폭발! 적에게 피해를 줍니다!
아이템을 사용합니다.
예제 3 : virtual을 사용하지 않았을 때
class Enemy
{
public void Die()
{
Console.WriteLine("Enemy died.");
}
}
class Boss : Enemy
{
public void Die()
{
Console.WriteLine("Boss exploded and died!");
}
}
// virtual 키워드가 없으면, 자식 클래스의 함수는 숨겨지고
// 부모 참조를 통해 자식 동작이 실행되지 않음 (다형성 X)
Enemy e1 = new Boss();
e1.Die();
// 출력 :
Enemy died. (❌ 자식 메서드 호출되지 않음)
요약 정리
• 다형성은 부모 타입으로 자식 객체를 제어할 때, 자식의 동작이 실행되는 성질입니다.
• 이를 위해 부모 메서드는 virtual, 자식 메서드는 override로 작성해야 합니다.
• 다형성은 코드의 유연성과 확장성을 높이는 객체지향의 핵심 원리 중 하나입니다.
• 이름만 같은 메서드를 virtual 없이 정의하면 단순히 숨김(hiding)일 뿐, 다형성이 발동하지 않습니다.
• 이러한 구조는 코드 재사용과 유지보수에 매우 효과적이며, 실전 개발에서도 자주 사용되는 패턴입니다.
'C#' 카테고리의 다른 글
=> 에 대한 진실과 오해 : 이것은 람다일까 아닐까? (0) | 2025.06.23 |
---|---|
속성(Property)의 동작 원리 정리 (0) | 2025.06.23 |
구조체를 초기화하는 몇 가지 방법들 (0) | 2025.06.03 |
접근 제한자가 없는 struct, class 는 public 일까? private 일까? (0) | 2025.05.31 |
new() 의 완벽한 이해 (0) | 2025.05.20 |