C#

[C#]가상 메서드(Virtual Method), Virtual 키워드

DevStory 2022. 5. 16.

가상 메서드(Virtual Method)

Virtual 키워드를 소개하기 전에 객체 지향 프로그래밍(OOP)의 특징인 상속과 재정의에 대해 이해하고 있는지 알아봅시다. 

 

메서드 재정의는 상속과 밀접하게 관련 있는 객체 지향 프로그래밍의 특징입니다. 자식 클래스에서 부모 메서드의 매개 변수 및 반환 타입을 재정의하는 것을 메서드 재정의라고 합니다.

 

C#에서 메서드 재정의를 허용 하기 위해 부모 클래스의 메서드를 virtual 키워드로 선언합니다. virtual 키워드로 선언된 메서드는 가상 메서드라고 부르기도 하며, 가상 메서드가 자식 클래스에서 재정의될 수 있음을 알립니다.

 

즉, virtual 키워드는 메서드 재정의를 허용하기 위해 사용됩니다.


virtual 키워드 사용 방법

재정의가 허용되는 메서드에 virtual 키워드를 추가합니다.

class Parent
{
  // 프로퍼티도 virtual 키워드 사용할 수 있습니다.
  public virtual string Str { get; set; }
  
  // 가상 메서드로 선언합니다.
  public virtual void show() 
  {
    Console.WriteLine("Parent의 show() 메서드");
  }
}

class Child : Parent
{
  // 프로퍼티도 재정의할 수 있습니다.
  public override string Str { get; set; }
  
  // show() 메서드를 재정의합니다.
  public override void show()
  {
    Console.WriteLine("Parent 클래스의 show() 메서드 오버로드");
  }
}

Parent 클래스의 Str 프로퍼티와 show() 메서드가 자식 클래스에서 재정의할 수 있도록 virtual 키워드를 추가합니다. 자식 클래스인 Child는 override 키워드를 사용하여 프로퍼티 또는 메서드를 재정의합니다.


virtual 키워드 특징

  • 모든 메서드는 가상 메서드가 아니므로 재정의가 허용되는 프로퍼티 및 메서드에 virtual 키워드를 선언합니다.
  • 가상 메서드는 자식 클래스에서 override 키워드를 사용하여 재정의합니다.
  • 가상 메서드에는 out 및 ref type의 매개변수가 존재할 수 있습니다.
  • 자식 클래스에서 재정의된 메서드에 sealed 키워드를 사용하여 봉인 메서드로 만들 수 있습니다.
  • 정적 멤버와 추상 멤버는 가상 멤버로 선언할 수 없습니다.

가상 메서드 동작 과정

오버로딩과 오버라이딩의 가장 큰 차이점은 오버로딩은 컴파일 시간에 작동하는 반면, 오버라이딩은 런타임에 작동한다는 것입니다. virtual 키워드는 런타임에 실행되므로 메서드 오버라이딩 개념을 따릅니다.

 

가상 메서드 또는 프로퍼티를 접근하거나 호출하면 컴파일러는 메서드 또는 프로퍼티가 재정의되었는지 확인합니다. 재정의된 메서드 또는 프로퍼티가 존재하면 재정의된 메서드 또는 프로퍼티가 호출되고 재정의된 메서드 프로퍼티가 없으면 원래 메서드 또는 프로퍼티가 호출됩니다.

오버로딩(Overloading)
매개변수와 반환 타입이 다르지만, 메서드 이름이 동일합니다.

오버라이딩(Overriding)
상위 클래스의 메서드를 하위 클래스에서 재정의합니다. 
반응형

예제

다음은 복잡해 보이지만, 단순한 예제입니다.

class A
{
  public virtual void show() 
  {
    Console.WriteLine("A 클래스의 show() 메서드");
  }
}

class B : A
{
  public override void show()
  {
    Console.WriteLine("A 클래스의 show() 메서드 재정의");
  }
}

class C : B { }

class Program
{
  static void Main(string[] args)
  {
    A a = new A();
    a.show();

    B b = new B();
    b.show();

    C c = new C();
    c.show();
  }
}

실행 결과

A 클래스의 show() 메서드
A 클래스의 show() 메서드 재정의
A 클래스의 show() 메서드 재정의

A 클래스에는 show()라는 가상 메서드가 존재합니다. A 클래스 객체의 show() 메서드를 호출하면 A 클래스의 show() 메서드가 호출됩니다.

 

B 클래스는 A 클래스를 상속받아 show() 메서드를 재정의합니다. B 클래스 객체의 show() 메서드를 호출하면 B 클래스에서 재정의된 show() 메서드가 호출됩니다.

 

C 클래스는 B 클래스를 상속받지만, show() 메서드를 재정의하지 않습니다. C 클래스 객체의 show() 메서드를 호출하면 B 클래스에서 재정의된 show() 메서드가 호출됩니다.


정리

  • virtual 키워드는 재정의를 허용하기 위해 사용되는 키워드입니다.
  • virtual 키워드는 메서드, 프로퍼티, 이벤트에 선언할 수 있으며, 변수는 선언할 수 없습니다. 
  • 자식 클래스는 override 키워드를 사용하여 virtual 키워드로 선언된 메서드를 재정의할 수 있습니다.
반응형

'C#' 카테고리의 다른 글

[C#]Partial 클래스(Partial Class)  (0) 2022.05.18
[C#]메서드 숨기기(Method Hiding)  (0) 2022.05.16
[C#]봉인 클래스(Sealed Class) 및 봉인 메서드(Sealed Class)  (0) 2022.05.15
[C#]구조체(Struct)  (0) 2022.05.15
[C#]this 키워드  (0) 2022.05.09

댓글