abstract(C# 참조)
업데이트: 2007년 11월
abstract 한정자는 클래스, 메서드, 속성, 인덱서 및 이벤트에 사용할 수 있습니다. 클래스 선언에 abstract 한정자를 사용하면 해당 클래스가 다른 클래스의 기본 클래스로만 사용됨을 나타냅니다. abstract로 표시된 멤버나 abstract 클래스에 포함된 멤버는 해당 abstract 클래스에서 파생되는 클래스에 의해 구현되어야 합니다.
예제
이 예제에서 Square 클래스는 ShapesClass에서 파생되므로 Area의 구현을 제공해야 합니다.
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int side = 0;
public Square(int n)
{
side = n;
}
// Area method is required to avoid
// a compile-time error.
public override int Area()
{
return side * side;
}
static void Main()
{
Square sq = new Square(12);
Console.WriteLine("Area of the square = {0}", sq.Area());
}
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
}
// Output: Area of the square = 144
추상 클래스에는 다음과 같은 특징이 있습니다.
추상 클래스는 인스턴스화할 수 없습니다.
추상 클래스에는 추상 메서드 및 접근자가 포함될 수 있습니다.
sealed 한정자를 사용하면 클래스를 상속할 수 없게 되므로 추상 클래스는 sealed(C# 참조) 한정자로 수정할 수 없습니다.
추상 클래스에서 파생된 비 추상 클래스에는 상속된 모든 추상 메서드 및 접근자의 실제 구현이 포함되어야 합니다.
메서드 또는 속성 선언에 abstract 한정자를 사용하면 해당 메서드 또는 속성에 구현이 포함되지 않음을 나타냅니다.
추상 메서드에는 다음과 같은 특징이 있습니다.
추상 메서드는 암시적으로 가상 메서드입니다.
추상 메서드 선언은 추상 클래스에서만 허용됩니다.
추상 메서드 선언에서는 실제 구현을 제공하지 않기 때문에 메서드 본문이 없습니다. 메서드 선언은 단순히 세미콜론으로 끝나며 시그니처 뒤에 중괄호({ })가 없습니다. 예를 들면 다음과 같습니다.
public abstract void MyMethod();
구현은 비추상 클래스의 멤버인 재정의 메서드 override(C# 참조)에 의해 제공됩니다.
추상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있습니다.
정적 속성에는 abstract 한정자를 사용할 수 없습니다.
상속된 추상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있습니다.
추상 클래스에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.
추상 클래스는 모든 인터페이스 멤버에 대한 구현을 제공해야 합니다.
인터페이스를 구현하는 추상 클래스는 인터페이스 메서드를 추상 메서드에 매핑할 수도 있습니다. 예를 들면 다음과 같습니다.
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
다음 예제에서 DerivedClass 클래스는 추상 클래스 BaseClass에서 파생되었습니다. 이 추상 클래스에는 추상 메서드 AbstractMethod와 두 개의 추상 속성 X 및 Y가 포함되어 있습니다.
abstract class BaseClass // Abstract class
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod(); // Abstract method
public abstract int X { get; }
public abstract int Y { get; }
}
class DerivedClass : BaseClass
{
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
// Output: x = 111, y = 161
앞의 예제에서 다음과 같은 문으로 추상 클래스를 인스턴스화하려고 하면
BaseClass bc = new BaseClass(); // Error
컴파일러에서 추상 클래스 'BaseClass'의 인스턴스를 만들 수 없다는 오류가 발생합니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 단원을 참조하십시오.
1.6.5.4 Virtual, override, and abstract methods
10.1.1.1 추상 클래스