티스토리 뷰

C#

[C#] Override & New & Sealed

sungjine 2023. 3. 2. 18:28
반응형

오버라이드(Override)란 부모클래스를 상속받은 자식클래스가 부모클래스에 존재하는 메서드를 다시 정의하는 것을 뜻한다.

메서드를 다시 정의하는 것이기 때문에 메서드의 구조는 같아야한다.

class BaseClass
{
    public void Method()
    {
    }
}
class DerivedClass : BaseClass
{
    public void Method()
    {
    }
}

오버라이드하고 있는 위 코드는 재정의하고 있는 DerivedClass.Method에 경고가 발생한다.

 

위와 같은 경고가 발생하지 않도록 수정한느 방법은 두 가지가 있다.

 

하나는 override 키워드를 사용하는 방법이 있고

(override 키워드를 사용하기 위해서는 부모클래스의 메서드에 virtual나 abstract 키워드를 사용해야 한다.)

class BaseClass
{
    public virtual void Method()
    {
        Console.WriteLine("부모클래스 - Method");
    }
}
class DerivedClass : BaseClass
{
    public override void Method()
    {
        Console.WriteLine("자식클래스 - Method");
    }
}
class Program
{
    static void Main(string[] args)
    {
        BaseClass bc = new BaseClass();
        DerivedClass dc = new DerivedClass();
        BaseClass bcdc = new DerivedClass();
        bc.Method();
        dc.Method();
        bcdc.Method();
    }
}

다른 하나는 new 키워드를 사용하는 방법이 있다.

using System;

class BaseClass
{
    public void Method()
    {
        Console.WriteLine("부모클래스 - Method");
    }
}
class DerivedClass : BaseClass
{
    public new void Method()
    {
        Console.WriteLine("자식클래스 - Method");
    }
}
class Program
{
    static void Main(string[] args)
    {
        BaseClass bc = new BaseClass();
        DerivedClass dc = new DerivedClass();
        BaseClass bcdc = new DerivedClass();
        bc.Method();
        dc.Method();
        bcdc.Method();
    }
}

각각의 결과는 아래와 같다.

 1> override

부모클래스 - Method

자식클래스 - Method

자식클래스 - Method

 2> new

부모클래스 - Method

자식클래스 - Method

부모클래스 - Method

 

두 방법의 차이는 부모클래스에 자식클래스를 할당했을 때 발생한다.

이런 차이가 발생하는 이유는 new 키워드는 부모클래스의 메서드를 다시 정의하는 것이 아니라 같은 구조의 메서드를 자식클래스에 만드는 것이기 때문이다.

 

즉 override 키워드는 재정의를 하는 것이고 new 키워드는 해당 클래스에서 사용할 수 있는 메서드를 만드는데 같은 구조의 메서드를 만드는 것을 뜻한다.

따라서 부모클래스에서 사용될 때도 차이를 가지게 되는데, 아래 코드는

using System;

class BaseClass
{
    public void Show()
    {
        Method();
    }
    public virtual void Method()
    {
        Console.WriteLine("BaseClass");
    }
}
class OverrideDerivedClass : BaseClass
{
    public override void Method()
    {
        Console.WriteLine("OverrideDerivedClass");
    }
}
class NewDerivedClass : BaseClass
{
    public new void Method()
    {
        Console.WriteLine("NewDerivedClass");
    }
}
class Program
{
    static void Main(string[] args)
    {
        BaseClass bc = new BaseClass();
        OverrideDerivedClass odc = new OverrideDerivedClass();
        NewDerivedClass ndc = new NewDerivedClass();
        bc.Show();
        odc.Show();
        ndc.Show();
    }
}

Show 메서드가 부모클래스에만 존재하기 때문에 아래와 같은 결과를 보여준다.

BaseClass

OverrideDerivedClass

BaseClass

 

그리고 override 키워드나 new 키워드를 사용하지 않았을 때는 new 키워드를 사용한 것과 같이 동작한다.

 

이와 관련해서 sealed 키워드는 오버라이드하고 있는 메서드에 사용하여 하위 클래스에서 재정의하지 못하도록 막는 키워드인데 new 키워드와는 같이 사용할 수 없다.

using System;

class BaseClass
{
    public virtual void Method1()
    {
    }
    public void Method2()
    {
    }
}
class DerivedClass : BaseClass
{
    public override sealed void Method1()
    {
    }
    public new sealed void Method2() // 에러발생
    {
    }
}
반응형
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31