본문 바로가기

game dev/C#

인터페이스, 추상 클래스, virtual

C#에서 인터페이스, 추상 클래스, 그리고 virtual 키워드는 모두 객체 지향 프로그래밍에서 다형성과 상속을 지원하기 위해 사용되지만, 각각의 목적과 사용 방법은 다릅니다. 

 

인터페이스 (Interface)

인터페이스는 클래스나 구조체에서 구현해야 하는 메서드, 속성, 이벤트, 인덱서 등의 서명을 정의합니다. 인터페이스 자체는 구현을 포함하지 않으며, 이를 구현하는 클래스나 구조체가 인터페이스에 정의된 모든 멤버를 구현해야 합니다.

 

특징

  • 다중 상속 지원: 클래스는 여러 개의 인터페이스를 구현할 수 있습니다.
  • 구현 강제: 인터페이스를 구현하는 클래스는 인터페이스의 모든 멤버를 반드시 구현해야 합니다.
  • 기본 구현 없음: 인터페이스는 기본 구현을 포함하지 않습니다. (C# 8.0 이후부터는 기본 구현을 포함할 수 있습니다)
interface IAnimal
{
    void Speak();
    void Move();
}

class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Woof");
    }

    public void Move()
    {
        Console.WriteLine("Run");
    }
}

 

 

 

추상 클래스 (Abstract Class)

추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있는 클래스입니다. 추상 메서드는 선언만 있고 구현은 없습니다. 추상 클래스는 인터페이스와 달리 구현된 메서드도 포함할 수 있습니다.

특징

  • 단일 상속: 클래스는 하나의 추상 클래스만 상속할 수 있습니다.
  • 일부 구현 제공: 추상 클래스는 추상 메서드 외에도 구현된 메서드와 속성을 포함할 수 있습니다.
  • 인스턴스화 불가: 추상 클래스 자체는 인스턴스화할 수 없습니다.
abstract class Animal
{
    public abstract void Speak();
    
    public void Move()
    {
        Console.WriteLine("Move");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof");
    }
}

 

 

virtual 키워드

virtual 키워드는 기본 클래스의 메서드, 속성, 이벤트가 파생 클래스에서 재정의될 수 있음을 나타냅니다. virtual 메서드는 기본 구현을 제공하며, 이를 상속받는 클래스에서 override 키워드를 사용해 재정의할 수 있습니다.

특징

  • 기본 구현 제공: virtual 메서드는 기본 구현을 포함할 수 있습니다.
  • 선택적 재정의: 파생 클래스는 virtual 메서드를 재정의할 수도 있고, 그대로 사용할 수도 있습니다.
  • 재정의 가능: 파생 클래스에서 override 키워드를 사용해 virtual 메서드를 재정의할 수 있습니다.
class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof");
    }
}

 

 

 

비교

 

 

 

사용 시기

  • 인터페이스는 구현의 세부 사항보다는 특정 행동을 보장하고 싶을 때 사용합니다.
  • 추상 클래스일부 공통된 구현이 필요하지만, 일부는 서브클래스가 제공해야 할 때 사용합니다.
  • virtual 메서드기본 클래스에 기본 구현을 제공하면서 필요 시 서브클래스가 이를 재정의할 수 있게 하고 싶을 때 사용합니다.

 

 

 

참고 자료

'game dev > C#' 카테고리의 다른 글

람다로 표현된 메서드  (0) 2024.06.14
델리게이트  (0) 2024.06.14
상속과 다형성  (0) 2024.06.12
C# virtual 과 abstract 차이 + interface  (1) 2024.01.31
BFS를 이용한 미로 최단거리 길찾기 구현  (0) 2024.01.09