virtual
virtual (C# 참조)
virtual 키워드는 메서드, 속성(프로퍼티), 인덱서, 이벤트 선언에 붙여서 파생 클래스가 그 멤버를 재정의(override)할 수 있게 만들어 주는 키워드예요.
이 메서드를 상속받는 어떤 클래스든 아래처럼 재정의할 수 있습니다.
public virtual double Area()
{
return x * y;
}
파생 클래스의 재정의 멤버(overriding member)는 virtual 멤버의 구현을 바꿀 수 있습니다. virtual 키워드를 언제, 어떻게 써야 하는지는 Override와 New 키워드를 이용한 버전 관리와 Override와 New 키워드를 사용할 시점 문서를 참고해 주세요.
virtual 메서드를 호출하면 런타임이 객체의 실제 타입을 확인해서 재정의 멤버가 있는지 살펴봐요. 재정의 멤버가 있으면 **가장 파생된 클래스(most derived class)**의 멤버를 호출하고, 어떤 파생 클래스도 재정의하지 않았다면 원래 멤버를 호출합니다.
메서드는 기본적으로 virtual이 아니에요. 다시 말해, non-virtual 메서드는 재정의할 수 없습니다.
아래는 virtual 속성의 예시입니다.
:::code language="csharp" source="./snippets/csrefKeywordsModifiers.cs" id="26":::
virtual 속성은 virtual 메서드와 거의 똑같이 동작하는데, 선언과 호출 문법만 조금 다릅니다.
- 상속받은 virtual 속성은 파생 클래스에서
override한정자를 붙인 속성 선언으로 재정의할 수 있어요.
예제
이 예제에서 Shape 클래스는 좌표 x, y 두 개와 Area() virtual 메서드를 갖고 있어요. Circle, Cylinder, Sphere 같은 서로 다른 도형 클래스가 Shape를 상속받고, 각 도형마다 표면적을 계산합니다. 각 파생 클래스는 자기만의 Area() 재정의 구현을 가지고 있죠.
Circle, Cylinder, Sphere 파생 클래스는 모두 아래 선언처럼 기본 클래스를 초기화하는 생성자를 사용합니다.
public Cylinder(double r, double h): base(r, h) {}
아래 프로그램은 메서드에 연결된 객체에 따라 알맞은 Area() 구현을 호출해서 각 도형의 넓이를 계산하고 보여줍니다.
:::code language="csharp" source="./snippets/csrefKeywordsModifiers.cs" id="23":::
C# 언어 사양
[!INCLUDECSharplangspec]