[C#] 다형성_Virtual, Abstract, Interface
출처
객체 지향언어에서 상속을 얘기할 때, 사용되는 한정자
Virtual
- 가상 키워드
- 메서드, 속성, 인덱서 또는 이벤트 선언을 한정하는데 사용된다
- 파생 클래스에서 필요에 따라서 재정의할 수 있지만 필수는 아님
- virtual 한정정자를 사용한 클래스는 완벽한 기능을 제공할 수 있다
public class Animal
{
public virtual void Speak()
{
Console.WriteLine("Nothing!");
}
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("멍멍!");
}
}
Dog dog = new Dog();
dog.Speak(); // 멍멍
Abstract
- 추상 키워드
- 불완전하며, 파생클래스에서 구현해야 하는 클래스 및 클래스 멤버를 만들 수 있다
- 추상 클래스의 사용목적은 여러 개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의를 제공 하는 것
- 추상 클래스는 인스턴스화 할 수 없다
public abstract class Animal
{
public abstract void Speak();
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("멍멍!");
}
}
Dog dog = new Dog();
dog.Speak(); // 멍멍!
Animal animal = new Animal(); // Error!, 추상 클래스는 인스턴스화 할 수 없다
Interface
- 인터페이스는 abstract와 비슷하지만 멤버변수(필드)를 사용할 수 없다
- 대신 프로퍼티는 사용가능
- 인터페이스는 보통 여러 클래스에 공통적인 기능을 추가하기 위해 사용
public interface Animal
{
void Speak();
string Name
{
get;
set;
}
}
class Dog : Animal
{
private string name;
public void Speak()
{
Console.WriteLine(name + "-> 멍멍!");
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
Dog dog = new Dog();
dog.Name = "흰둥이";
dog.Speak(); // 흰둥이->멍멍!
정리
| virtual | 하나의 기능을하는 완전한 클래스 파생클래스에 상속해서 추가적인 기능 추가 및 virtual 한정자가 달린 것을 재정의해서 사용 가능 |
| abstract | 여러 개의 파생클래스에서 공유할 기본 클래스의 공통적인 정의만 하고, 파생 클래스에서 abstract 한정자가 달린 것을 모두 재정의 해야 함. 추상 클래스는 인스턴스화 할 수 없다 |
| interface | 추상 키워드와 비슷하지만 멤버 변수를 사용할 수 없다 보통 abstract는 개념적으로 계층적인 구조에서 사용되며, interface는 서로 다른 계층이나 타입이라도 기능 추가를 위해 사용한다 |