본문 바로가기
프로그래밍/C#

C# virtual 키워드

by bantomak 2023. 7. 5.

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# 인터페이스 이해하기

인터페이스(Interface) 인터페이스는 추상화를 달성하고 객체가 서로 상호 작용할 수 있도록 하는 강력한 도구이다. 클래스가 구현해야 하는 메서드, 속성 및 이벤트의 집합을 정의하지만 이에 대

jettstream.tistory.com

 

참조 사이트

 

virtual - C# 참조

virtual(C# 참조) 아티클 04/07/2023 기여자 14명 피드백 이 문서의 내용 --> virtual 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 수정하고 파생 클래스에서 재정의하도록 허용하는 데 사용됩니다.

learn.microsoft.com

댓글