다음을 통해 공유


추상 및 봉인된 클래스 및 클래스 멤버(C# 프로그래밍 가이드)

추상 키워드를 사용하면 불완전하고 파생 클래스에서 구현해야 하는 클래스 및 클래스 멤버를 만들 수 있습니다.

sealed 키워드를 사용하면 이전에 가상으로 표시된 클래스 또는 특정 클래스 멤버의 상속을 방지할 수 있습니다.

추상 클래스 및 클래스 멤버

클래스 정의 앞에 키워드 abstract 를 배치하여 클래스를 추상으로 선언할 수 있습니다. 다음은 그 예입니다.

public abstract class A
{
    // Class members here.
}

추상 클래스는 인스턴스화할 수 없습니다. 추상 클래스의 목적은 여러 파생 클래스가 공유할 수 있는 기본 클래스의 공통 정의를 제공하는 것입니다. 예를 들어 클래스 라이브러리는 여러 함수에 대한 매개 변수로 사용되는 추상 클래스를 정의할 수 있으며, 파생 클래스를 만들어 클래스의 고유한 구현을 제공하려면 해당 라이브러리를 사용하는 프로그래머가 필요합니다.

추상 클래스는 추상 메서드를 정의할 수도 있습니다. 이 작업은 메서드의 반환 형식 앞에 키워드 abstract 를 추가하여 수행됩니다. 다음은 그 예입니다.

public abstract class A
{
    public abstract void DoWork(int i);
}

추상 메서드에는 구현이 없으므로 메서드 정의 뒤에 일반 메서드 블록 대신 세미콜론이 옵니다. 추상 클래스의 파생 클래스는 모든 추상 메서드를 구현해야 합니다. 추상 클래스가 기본 클래스에서 가상 메서드를 상속하는 경우 추상 클래스는 추상 메서드를 사용하여 가상 메서드를 재정의할 수 있습니다. 다음은 그 예입니다.

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

메서드가 virtual로 선언된 경우에도 추상 클래스를 상속한 모든 클래스에 여전히 가상 메서드로 작용합니다. 추상 메서드를 상속하는 클래스는 메서드의 원래 구현에 액세스할 수 없습니다. 이전 예제 DoWork 에서는 F 클래스에서 클래스 D를 호출 DoWork 할 수 없습니다. 이러한 방식으로 추상 클래스는 파생 클래스가 가상 메서드에 대한 새 메서드 구현을 제공하도록 강제할 수 있습니다.

봉인된 클래스 및 클래스 멤버

클래스 정의 앞에 키워드 를 배치하여 sealed로 선언할 수 있습니다. 다음은 그 예입니다.

public sealed class D
{
    // Class members here.
}

봉인된 클래스는 기본 클래스로 사용할 수 없습니다. 이러한 이유로 추상 클래스일 수도 없습니다. 봉인된 클래스는 파생을 방지합니다. 기본 클래스로 사용할 수 없으므로 일부 런타임 최적화를 통해 봉인된 클래스 멤버를 약간 더 빠르게 호출할 수 있습니다.

기본 클래스의 가상 멤버를 재정의하는 파생 클래스의 메서드, 인덱서, 속성 또는 이벤트는 해당 멤버를 sealed로 선언할 수 있습니다. 이렇게 하면 추가 파생 클래스에 대한 멤버의 가상 측면이 부정됩니다. 이 작업은 클래스 멤버 선언에서 sealed 키워드 앞에 키워드를 배치하여 수행됩니다. 다음은 그 예입니다.

public class D : C
{
    public sealed override void DoWork() { }
}

참고하십시오