반응형
virtual 키워드란?
virtual 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 수정하고 파생 클래스에서 재정의하도록 허용하는 데 사용된다.
예를 들어 이 메서드는 이를 상속하는 모든 클래스에서 재정의 할 수 있다.
- virtual - 가상함수. 구현부가 필요하다. 상속받은 쪽에서 무조건 구현하지 않아도 된다.
- abstract - 순가상함수. 상속받은 쪽에서 무조건 구현되어야 한다.
public class base
{
// virtual은 base클래스에서 정의되어야 한다. 정의하지 않으면 error!
public virtual double Area()
{
return x * y;
}
// abstract는 base클래스에서 정의하지 않아도 된다.
public abstract bool IsValid();
}
public class derived : base
{
public override double Area()
{
base.Area();
}
// 순가상 함수는 derived 클래스에서 반드시 정의되어야 한다.
public override bool IsValid()
{
return true;
}
}
가상 멤버의 구현은 파생 클래스의 재정의 멤버로 변경할 수 있다.
가상 메서드가 호출되면 재정의 멤버에 대해 개체의 런타임 형식이 확인된다. 파생 클래스가 멤버를 재정의 하지 않은 경우 가장 많이 파생된 클래스의 재정의 멤버가 호출된다.
기본적으로 가상 메서드만 재정의 할 수 있다.
예제 코드
class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double _x, _y;
public Shape()
{
}
public Shape(double x, double y)
{
_x = x;
_y = y;
}
public virtual double Area()
{
return _x * _y;
}
}
public class Circle : Shape
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * _x * _x;
}
}
public class Sphere : Shape
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * _x * _x;
}
}
public class Cylinder : Shape
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * _x * _x + 2 * PI * _x * _y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Shape c = new Circle(r);
Shape s = new Sphere(r);
Shape l = new Cylinder(r, h);
// Display results.
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
추상 메서드(Abstract Method) | 가상 메서드(Virtual Method) |
추상 메서드는 선언만 가능 | 가상 메서드는 타입 기반 다형성에 주로 사용 |
추상 메서드를 자식 클래스에서 반드시 재정의 되어야함 | 반드시 재정의하지 않아도 됨 |
abstract 키워드는 메서드와 클래스에 사용 가능 | virtual 키워드는 메서드에 사용 가능 (클래스 불가) |
abstract 메서드는 오직 abstract 클래스 안에서만 선언 가능 | 추상 클래스와 비 추상 클래스에 상관없이 선언 가능 |
static, virtual, private 호환 불가 | static, abstract, private, override 호환 불가 |
일관성을 유지하기에 좋음 | 커스터마이징 하기 좋음 |
함께 읽으면 좋은 글
참조 사이트
'프로그래밍 > C#' 카테고리의 다른 글
C# 7.0 튜플(Tuple) (6) | 2023.07.27 |
---|---|
C# Queue 기본 생성자로 초기화 하기 (18) | 2023.07.26 |
C# 표현식 본체 멤버(Expression-bodied member) (4) | 2023.06.28 |
C# where 제네릭 형식 제약(generic type constraint) (6) | 2023.06.28 |
Queue vs ConcurrentQueue로 쓰레드 환경에서 테스트 (12) | 2023.06.27 |
댓글