추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)
abstract 키워드를 사용하면 불완전하여 파생 클래스에서 구현해야 하는 클래스 및 클래스 멤버를 만들 수 있습니다.
sealed 키워드를 사용하면 이전에 virtual로 표시되었던 클래스나 특정 클래스 멤버가 상속되지 못하도록 할 수 있습니다.
추상 클래스 및 클래스 멤버
클래스 정의 앞에 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 메서드는 abstract로 선언되어도 추상 클래스에서 상속된 모든 클래스에 대해 여전히 가상입니다. 추상 메서드를 상속하는 클래스에서는 메서드의 원본 구현에 액세스할 수 없습니다. 앞의 예제에서 F 클래스의 DoWork에서는 D 클래스의 DoWork를 호출할 수 없습니다. 따라서 추상 클래스는 파생 클래스에서 가상 메서드에 대한 새 메서드 구현을 반드시 제공하도록 제한할 수 있습니다.
봉인 클래스 및 클래스 멤버
클래스 정의 앞에 sealed를 배치하여 클래스를 sealed로 선언할 수 있습니다. 예를 들면 다음과 같습니다.
public sealed class D
{
// Class members here.
}
봉인 클래스는 기본 클래스로 사용할 수 없습니다. 그러므로 추상 클래스가 될 수도 없습니다. 봉인 클래스는 상속할 수 없습니다. 봉인 클래스는 기본 클래스로 사용될 수 없으므로 일부 런타임 최적화에서는 봉인 클래스 호출이 약간 더 빨라집니다.
기본 클래스의 가상 멤버를 재정의하는 파생 클래스의 클래스 멤버, 메서드, 필드, 속성 또는 이벤트를 봉인으로 선언할 수 있습니다. 이렇게 하면 이후에 파생되는 클래스에서는 해당 멤버가 가상이 아니게 됩니다. 클래스 멤버 선언에서 override 키워드 앞에 sealed 키워드를 넣으면 멤버가 봉인으로 선언됩니다. 예를 들면 다음과 같습니다.
public class D : C
{
public sealed override void DoWork() { }
}