다음을 통해 공유


sealed(C# 참조)

클래스에 적용된 경우 sealed 한정자는 다른 클래스가 해당 클래스에서 상속하지 못하도록 합니다. 다음 예제에서 B 클래스는 A 클래스에서 상속하지만 B 클래스에서 상속할 수 있는 클래스는 없습니다.

class A {}
sealed class B : A {}

기본 클래스의 가상 메서드 또는 속성을 재정의하는 메서드 또는 속성에 sealed 한정자를 사용할 수도 있습니다. 이렇게 하면 사용자 클래스에서 클래스가 파생되고 특정 가상 메서드 또는 속성을 재정의하지 못하도록 할 수 있습니다.

예시

다음 예제에서 ZY에서 상속하지만 ZX에서 선언되고 Y에서 봉인된 가상 함수 F를 재정의할 수 없습니다.

class X
{
    protected virtual void F() { Console.WriteLine("X.F"); }
    protected virtual void F2() { Console.WriteLine("X.F2"); }
}

class Y : X
{
    sealed protected override void F() { Console.WriteLine("Y.F"); }
    protected override void F2() { Console.WriteLine("Y.F2"); }
}

class Z : Y
{
    // Attempting to override F causes compiler error CS0239.
    // protected override void F() { Console.WriteLine("Z.F"); }

    // Overriding F2 is allowed.
    protected override void F2() { Console.WriteLine("Z.F2"); }
}

클래스에서 새 메서드 또는 속성을 정의할 때 virtual로 선언하지 않으면 파생 클래스가 재정의하지 못하도록 할 수 있습니다.

추상 클래스는 추상 메서드 또는 속성 구현을 제공하는 클래스에 상속되어야 하므로 봉인 클래스에 abstract 한정자를 사용하면 오류가 발생합니다.

메서드 또는 속성에 적용된 경우 sealed 한정자는 항상 override와 함께 사용해야 합니다.

구조체는 암시적으로 봉인되므로 상속할 수 없습니다.

자세한 내용은 상속을 참조하세요.

더 많은 예제를 보려면 추상 및 봉인 클래스와 클래스 멤버를 참조하세요.

sealed class SealedClass
{
    public int x;
    public int y;
}

class SealedTest2
{
    static void Main()
    {
        var sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine($"x = {sc.x}, y = {sc.y}");
    }
}
// Output: x = 110, y = 150

앞의 예제에서 다음 문을 사용하여 봉인된 클래스에서 상속을 시도할 수 있습니다.

class MyDerivedC: SealedClass {} // Error

그 결과 다음 오류 메시지가 표시됩니다.

'MyDerivedC': cannot derive from sealed type 'SealedClass'

설명

클래스, 메서드 또는 속성을 봉인할지 여부를 결정하려면 일반적으로 다음 두 가지 사항을 고려해야 합니다.

  • 파생 클래스가 사용자 클래스의 사용자 지정을 통해 얻을 수 있는 잠재적인 이점

  • 파생 클래스가 사용자 클래스를 수정하여 더 이상 올바르게 또는 예상대로 작동하지 않을 가능성

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참고 항목