[C#] Virtual(가상) vs Abstract(추상) vs Interface(인터페이스)
예전에는 이런 거 알아봐야 정말 필요가 있을까? 생각도 했지만
그것은 내가 지금껏 얼레벌레 개발을 해왔기 때문에 중요성을 못 느꼈다는 것을 최근에 깨달았다
실제 운용 중인 서비스(내가 하고 있는 걸 서비스라고 할 수 있을까 싶긴 하지만ㅋ)는 정말 방대하고
그를 위해 OOP나 여러 구조들이 유기적으로 들어가 있다.
이번에 개발을 진행하면서 아 내가 이런 점이 부족했구나 싶어 virtual, abstract, interface의 특징들을 구분해보고자 한다.
개발 천재...는 아니고 아무튼 개발왕이 되는 그날까지...!!
Virtual (가상) 키워드
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/virtual
- virtual 키워드는 메소드, 속성, 인덱서 또는 이벤트 선언을 수정할 때 사용한다.
- 파생 클래스에서 재정의(override)할 수는 있으나, 필수 사항은 아니다.
public class Vehicle
{
public virtual void Ride()
{
Console.WriteLine("앞으로 달린다=3=3");
}
}
public class Motorbike : Vehicle
{
public override void Ride()
{
Console.WriteLine("앞바퀴를 들고 달린다=3=3");
}
}
public class Car : Vehicle
{
public override void Ride()
{
Console.WriteLine("앞으로 부와앙 달린다=3=3");
}
}
Motorbike mb = new Moborbike();
Car lambo = new Car();
mb.Ride(); // 앞바퀴를 들고 달린다=3=3
lambo.Ride(); // 앞으로 부와앙 달린다=3=3
Abstract (추상) 키워드
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/abstract
- abstract를 사용함으로써 클래스가 자체에서 인스턴스화 되지 않고, 기본 클래스의 공통적인 정의로만 사용됨을 나타낸다.
- 추상으로 표시된 멤버는 파생 클래스의 멤버에 의해 필수적으로 구현되어야 한다.
- 추상 클래스는 인스턴스화 할 수 없다.
public class Vehicle
{
public abstract void Ride();
}
public class Motorbike : Vehicle
{
public override void Ride()
{
Console.WriteLine("앞바퀴를 들고 달린다=3=3");
}
}
public class Car : Vehicle
{
public override void Ride()
{
Console.WriteLine("앞으로 부와앙 달린다=3=3");
}
}
Motorbike mb = new Moborbike();
Car lambo = new Car();
mb.Ride(); // 앞바퀴를 들고 달린다=3=3
lambo.Ride(); // 앞으로 부와앙 달린다=3=3
Interface (인터페이스) 키워드
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/interface
https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/interfaces
- class 또는 struct의 멤버에 대한 기본 구현을 정의하며, 여러 소스의 동작을 클래스에 포함 가능
- abstract와 비슷하지만, 변수를 사용할 수 없음. property는 사용 가능
- 규칙에 따라 인터페이스 이름은 대문자 I로 시작한다
public interface IVehicle
{
void Ride();
string Name
{
get;
set;
}
}
class Car : IVehicle
{
private string name;
public override void Ride()
{
Console.WriteLine(name + "이(가) 앞으로 부와앙 달린다=3=3");
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
Car lambo = new Car();
lambo.Name = "람보르기니";
lambo.Ride(); // 람보르기니이(가) 앞으로 부와앙 달린다=3=3
Virtual(가상) vs Abstract(추상) vs Interface(인터페이스)
- virtual은 하나의 기능을 하는 완전한 메소드이며, 파생 클래스에서 재정의함으로써 기능을 추가하여 사용 가능하다.
- abstract는 여러 파생 클래스의 공통적인 정의를 위해 사용하며, 모든 파생 클래스에서 abstract 메소드에 대한 신규 정의가 필수적이다.
- interface는 abstract와 달리 멤버 변수를 사용할 수 없다. class 또는 struct의 멤버에 대한 기본 구현을 정의하며, 서로 다른 계층이나 타입이라도 같은 기능을 추가하고 싶을 때 사용한다.