본문 바로가기
언어(C, C++, C#)

[C#] Virtual, Abstract, Interface

by 적용1 2024. 11. 5.
728x90

virtual

  • 역할 : 메서드, 속성(property), 이벤트 등을 자식 클래스에서 재정의할 수 있도록 허용하는 키워드이다.
  • 사용 방법 : 부모 클래스에서 메서드나 속성에 virtual을 붙여서 정의하면, 자식 클래스에서 override 키워드를 통해 재정의를 할 수 있다.
  • 특징 : virtual은 선택적 재정의를 허용하므로 반드시 재정의를 할 필요는 없다.
public class Parent
{
	public virtual void message()
    {
    	Console.WriteLine("Hi, I'm Parent.");
    }
}

public class Child : Parent
{
	public override void message()
    {
    	Console.WriteLine("Hi, I'm Child.");
    }
}

 

abstract

  • 역할 : 클래스나 메서드를 선언할 때 사용되고, 특정 메서드를 반드시 자식 클래스에서 구현하도록 강제한다.
  • 사용 방법 : abstract 메서드는 구현부가 없고, 메서드 선언부만 작성하게 된다. 이를 포함한 클래스도 abstract로 선언해야 한다.
  • 특징 : abstract는 재정의를 강제하므로 자식 클래스에서 구현하지 않으면 컴파일 오류가 날 수 있다.
public abstract class Animal
{
	public abstract void MakeSound();	// 선언만 하고 구현은 하지 않음
}

public class Dog : Animal
{
	public override void MakeSound()
    {
    	Console.WriteLine("왈왈");	// 상속받은 자식 클래스에서 반드시 구현해야됨
    }
}

 

interface

  • 역할 : 클래스가 구현해야 할 메서드, 속성(property), 이벤트 등을 정의하는 일종의 계약이다. 인터페이스는 다중 상속을 지원하기 때문에 하나의 클래스에 여러 인터페이스를 구현할 수 있다.
  • 사용 방법 : interface 키워드로 인터페이스를 정의하고, 클래스에서 ': 인터페이스 명' 으로 이를 구현한다.
  • 특징 : 인터페이스에 포함된 모든 메서드와 속성은 구현부가 없고, public이다. 인터페이스는 다중 상속을 지원하기 때문에 다양한 기능을 조합하여 클래스에 구현할 수 있다.
public interface canFly
{
	void Fly();
}

public interface canEat
{
	void Eat();
}

public class Bird : canFly, canEat
{
	public void Fly()
    {
    	Console.WriteLine("Bird can fly.");
    }
    
    public void Eat()
    {
    	Console.WriteLine("Bird can eat.");
    }
}

 

 

요약

  • virtual : 자식 클래스에서 선택적으로 재정의할 수 있는 메서드, 속성 등을 만들 때 사용
  • abstract : 자식 클래스에서 반드시 구현해야 하는 메서드, 속성 등을 정의할 때 사용하며, 해당 부모 클래스도 abstract로 선언해야 함
  • interface : 클래스가 구현해야 할 메서드나 속성을 계약으로 정의하며, 다중 상속을 지원하여 유연한 설계를 가능하게 함

       (계약 : 클래스가 특정 기능을 미리 갖추도록 설계 상의 가이드라인 느낌)

728x90