Coding/Unity, C#

Unity : Virtual, Abstract, Interface

가상(virtual)과 추상(abstract)

가상과 추상 사이에 핵심적인 차이점은 "완성도"다. 가상 클래스는 재정의(override)할 수 있지만 필수는 아니다. 반대로 추상 클래스는 '불완전하다는 의미'로서 파생 클래스에서 의무적으로 재정의해야 한다. 이 때, 불완전하다는 의미는 추상(abstract) 키워드를 달면 구체적은 기능을 제공할 수 없다는 뜻이다. 예시로 살펴보자.

// ==============================================
// 가상 클래스 예제
// ==============================================
public class Animal
{
	public virtual void Speak()
	{
		Console.WriteLine("Hello!"); // 가상 클래스는 구체적인 기능을 기술할 수 있다.
	}
}

public class Person : Animal
{
	// 가상 클래스의 파생 클래스는 꼭 재정의하지 않아도 된다.
}

// ==============================================
// 추상 클래스 예제
// ==============================================
public abstract class Animal
{
	public abstract void Speak(); // 추상 클래스는 구체적인 기능을 서술할 수 없다.
}

public class Person : Animal
{
	public override void Speak()
	{
		Console.WriteLine("안녕!");
	}
}
  virtual (가상) abstract (추상)
재정의 선택 필수
기능 구현 가능 불가능

 

추상(abstract)와 인터페이스(interface)

인터페이스는 가상(virtual) 클래스와 추상(abstract) 클래스보다 높은 추상성을 제공한다. 얼마나 추상성이 높냐면 C#은 다중 상속을 지원하지 않는데, 인터페이스만은 다중 상속을 할 수 있을 정도다. 높은 추상성을 제공하는 만큼 인터페이스도 추상 클래스처럼 어떤 기능 정의도 허락하지 않는다. 예제 코드로 살펴보자.

interface IAnimal
{
	void Speak(); //interface 안에서 정의된 메서드는 모두 abstract이므로 굳이 쓰지 않아도 된다.
}

class Person : IAnimal, Monobehavior //interface는 다중 상속을 받을 수 있다.
{
	public void Speak() //interface도 abstract처럼 재정의가 필수다.
    {
    	Console.WriteLine("Hello!");
    }
}
  abstract class interface
기능 구현 불가능 불가능
다중 상속 불가능 가능
abstract가 아닌 variable이나 method 소유 가능 불가능

'Coding > Unity, C#' 카테고리의 다른 글

Unity : Addressable Asset System  (0) 2021.03.02
Unity, Design Pattern: Command Pattern  (0) 2021.02.25
[Unity] Save, Load  (0) 2021.02.23
[Unity / Mirror] Authority  (0) 2021.02.19
Unity : Built-in Pipeline, Forward Rendering Path  (0) 2021.02.16