Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Archives
Today
Total
07-08 04:38
관리 메뉴

nomad-programmer

[Programming/C#] 오버라이딩 봉인 (sealed) 본문

Programming/C#

[Programming/C#] 오버라이딩 봉인 (sealed)

scii 2020. 9. 9. 14:14

클래스를 상속이 안 되도록 봉인하는 것처럼 메소드도 오버라이딩되지 않도록 봉인할 수 있다. 그렇다고 모든 메소드를 봉인할 수 있는 것은 아니다. virtual로 선언된 가상 메소드를 오버라딩한 버전의 메소드만이 가능하다.

using System;

namespace CSharpExample
{
    class Base
    {
        public virtual void SealMe()
        {
        }
    }

    class Derived : Base
    {
        public sealed override void SealMe()
        {
            base.SealMe();
        }
    }

    class WantToOverride : Derived
    {
        public override void SealMe()
        {
        }
    }

    class MainApp
    {

        static int Main(string[] args)
        {

            return 0;
        }
    }
}

/* 결과

에러 발생
'WantToOverride.SealMe()': cannot override inherited member 'Derived.SealMe()' because it is sealed

*/

봉인 메소드는 파생 클래스의 작성자를 위한 부모 클래스 작성자의 배려이다. 혹여라도 파생 클래스의 작성자가 부모 클래스로부터 상속받은 메소드 하나를 오버라이딩했는데 이 때문에 클래스의 다른 부분들이 오작동을 한다면 문제가 발생한다. 파생 클래스의 작성자는 자신이 작성한 코드만으로는 객체가 원하는대로 동작하지 않는 원인을 알 길이 없다. 오작동을 할 위험이 있거나 잘못 오버라이딩함으로써 발생할 수 있는 문제가 예상된다면, 이렇게 봉인(sealed) 메소드를 이용해서 상속을 사전에 막는 것이 낫다. 컴파일할 때 에러가 나므로 파생 클래스의 작성자는 코드가 제품으로 출시되기 전 문제를 파악할 수 있다.

 

vitual로 선언된 메소드를 오버라이딩한 버전의 메소드만 봉인 메소드로 만들 수 있는 이유

virtual로 선언한다는 의미는 부모 클래스의 작성자가 해당 메소드를 오버라이딩을 할 수 있도록 준비를 해놨다는 의미이다. 이 단계에서는 봉인의 의미가 없다.
오버라이딩을 원치 않으면 그저 virtual 한정자를 붙여주지 않으면 되니까. 문제는 오버라이딩한 메소드이다. 오버라이딩한 메소드는 파생 클래스의 파생 클래스에서도 자동으로 오버라이딩이 가능하다. 그래서 이곳에 오버라이딩을 막을 수 있는 브레이크인 sealed 한정자가 필요한 것이다.

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

[Programming/C#] 분할 클래스  (0) 2020.09.09
[Programming/C#] 중첩 클래스  (0) 2020.09.09
[Programming/C#] 메소드 숨기기  (0) 2020.09.09
[Programming/C#] 오버라이딩과 다형성  (0) 2020.09.09
[Programming/C#] 추상 클래스  (0) 2020.09.09
Comments