메서드 재정의(virtual, override)


virtual

부모 클래스 함수 앞에 붙는 연산자.

자식 클래스에 의해서 재정의될 수 있다는 의미를 가지고 있다.

컴파일러는 이 지정자가 붙은 함수를 비가상함수와 다르게 컴파일함으로써 재정의될 준비를 한다.


override

자식 클래스 함수 앞에 붙는 연산자.

부모로부터 상속받은 함수와는 다르게 구현한다는 의미를 가지고 있다.

재정의되는 함수는 부모의 함수와 이름, 시그니처도 일치해야함.

재정의된 함수는 부모의 함수에 의존적인 경우가 많은데 이 때 base 키워드로 부모의 원래함수를 호출 할 수 있다.


예제

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

 

class Base

{

    public virtual void echo()

    {

        Console.WriteLine("base echo~!!");

    }

}

 

class Derived : Base

{

    public override void echo()

    {

        Console.WriteLine("derived echo~!!");

    }

}

 

class Program

{

    static void Main()

    {

        Base B = new Base();

        Derived D = new Derived();

        B.echo();

        D.echo();

        Base B2 = D;

        B2.echo();

    }

}

 

실행결과



B.echo와 D.echo는 당연한 결과라고 볼 수 있지만 B2.echo호출문의 결과는

derived echo~!!라는 결과를 출력합니다. 


                                                       Base B2 = D;

위 선언에서 B2의 정적 타입은 Base

B2의 동적 타입은 Derived가 됩니다.


일반적인 비가상 메서드는 정적 타입을 따르지만 가상 메서드에서는 

호출 객체가 실제로 가리키고 있는 타입, 즉 동적 타입을 따르게 됩니다.


echo함수가 가상함수 일 때에는 B2가 비록 Base타입이지만 Derived객체를 가리키고 있기 때문에

Derived의 메서드가 호출이 됩니다.


그렇다면 위 예제를 비가상 함수로 바꾸어 출력을 해보도록 하겠습니다.


public virtual void echo()

이 부분에서 virtual을 빼고,

public override void echo()

이 부분에서 override는 new로 바꾸어 출력해보겠습니다.



실행결과




참고.

여기서 new를 안붙이고 public void echo()로 변환해도 결과는 같습니다.

new를 붙이는 이유는 상속받은 멤버를 완전히 숨겨버리고 자식 클래스가 같은 이름으로 새로운 멤버를 만든다는 뜻으로써, 의도적으로 같은 이름을 사용한다는 것을 알리는 연산자라고 볼 수 있습니다.

물론 멤버를 숨기는 것이지 상속을 안받는다는 뜻은 아닙니다.

base.메서드명()을 이용하면 부모의 숨겨진 멤버를 상속 받을 수 있게 됩니다.

신고

'Windows Programming > Windows::C#' 카테고리의 다른 글

[C#] 메서드 재정의(virtual, override)  (0) 2013.03.31
[C#] 상속 예제  (0) 2013.03.31
C# GUI 구구단 프로그램  (0) 2012.02.16
윈도우즈 폼 예제  (0) 2012.02.16
C# 콘솔 예제(성적관리 프로그램)  (0) 2012.02.16

+ Recent posts

티스토리 툴바