C# 오버라이딩과 다형성

객체 지향 프로그래밍에서 다형성(Polymorphism : 여러 개의 형태를 갖는다)은 객체가 여러 형태를 가질 수 있음을 의미합니다. 객체가 수시로 변한다는 말이 아니라 자신으로부터 상속받아 만들어진 자식 클래스(파생 클래스)를 통해 다형성을 실현합니다.

오버라이딩


메소드를 오버라이딩하기 위해서는 오버라이딩 할 메소드가 virtual 키워드로 한정되어 있어야 합니다. 오버라이딩을 하는 측에서는 부모 클래스(기반 클래스)에 선언되어 있던 메소드를 재정의하고 있음을 컴파일러에게 알려야 하므로 override 키워드로 한정해줘야 합니다.

class Item
{
    public virtual void Using()
    {
        Console.WriteLine("Using()");
    }
    
}

class Posion : Item
{
    public override void Using()
    {
        base.Using();
        Console.WriteLine("Posion()");
    }
}
출력 결과

Using()
Posion()

위와 같이 virtual과 override 키워드로 부모 클래스(기반 클래스) 메소드를 재정의할 수 있습니다.

base.Using()를 호출하면 부모 클래스의 메소드를 그대로 호출합니다. 그리고 나서 나머지 코드들도 읽어집니다.

오버라이딩 못하는 경우는?


private로 선언한 메소드는 오버라이딩할 수 없습니다. private로 선언된 멤버는 파생 클래스에서 보이지 않습니다.

오버라이딩 봉인하기


클레스를 상속이 안되도록 봉인하는 것처럼 메소드도 오버라이딩이 되지 않도록 봉인할 수 있습니다.

virtual로 선언된 가상 메소드를 오버라이딩해서 재정의한 매소드만 가능합니다.

class Base
{
    public virtual void MyMethod()
    {
        Console.WriteLine("Base.MyMethod()");
    }
}

class Derived : Base
{
    public sealed override void MyMethod()
    {
        Console.WriteLine("Derived.MyMythod()");
    }
}

class ReDerived : Derived
{
    public override void MyMethod() // 컴파일 에러
    {
        Console.WriteLine("ReDerived.MyMythod()");
    }
}

Derived.MyMethod() 는 봉인되어 있으므로 재정의할 수 없다는 컴파일 에러가 나타납니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다