abstract(C# 참조)

abstract 한정자는 클래스, 메서드, 속성, 인덱서 및 이벤트에 사용할 수 있습니다. 클래스 선언에 abstract 한정자를 사용하면 해당 클래스가 다른 클래스의 기본 클래스로만 사용됨을 나타냅니다. abstract로 표시된 멤버나 abstract 클래스에 포함된 멤버는 해당 abstract 클래스에서 파생되는 클래스에 의해 구현되어야 합니다.

이 예제에서 Square 클래스는 ShapesClass에서 파생되므로 Area의 구현을 제공해야 합니다.

      abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int x, y;
    // Not providing an Area method results
    // in a compile-time error.
    public override int Area()
    {
        return x * y;
    }
}

추상 클래스에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.

설명

추상 클래스에는 다음과 같은 특징이 있습니다.

  • 추상 클래스는 인스턴스화할 수 없습니다.

  • 추상 클래스에는 추상 메서드 및 접근자가 포함될 수 있습니다.

  • 추상 클래스를 sealed(C# 참조) 한정자로 한정할 수 없습니다. 즉, 이 클래스는 상속되지 않습니다.

  • 추상 클래스에서 파생된 비 추상 클래스에는 상속된 모든 추상 메서드 및 접근자의 실제 구현이 포함되어야 합니다.

메서드 또는 속성 선언에 abstract 한정자를 사용하면 해당 메서드 또는 속성에 구현이 포함되지 않음을 나타냅니다.

추상 메서드에는 다음과 같은 특징이 있습니다.

  • 추상 메서드는 암시적으로 가상 메서드입니다.

  • 추상 메서드 선언은 추상 클래스에서만 허용됩니다.

  • 추상 메서드 선언에서는 실제 구현을 제공하지 않기 때문에 메서드 본문이 없습니다. 메서드 선언은 단순히 세미콜론으로 끝나며 시그니처 뒤에 중괄호({ })가 없습니다. 예를 들면 다음과 같습니다.

    public abstract void MyMethod();
    
  • 구현은 비추상 클래스의 멤버인 재정의 메서드 override(C# 참조)에 의해 제공됩니다.

  • 추상 메서드 선언에 static 또는 virtual한정자를 사용하면 오류가 발생합니다.

추상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있습니다.

  • 정적 속성에는 abstract 한정자를 사용할 수 없습니다.

  • 상속된 추상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있습니다.

추상 클래스는 모든 인터페이스 멤버에 대한 구현을 제공해야 합니다.

인터페이스를 구현하는 추상 클래스는 인터페이스 메서드를 추상 메서드에 매핑할 수도 있습니다. 예를 들면 다음과 같습니다.

interface I 
{
    void M();
}
abstract class C: I 
{
    public abstract void M();
}

예제

다음 예제에서 DerivedClass 클래스는 추상 클래스 BaseClass에서 파생되었습니다. 이 추상 클래스에는 추상 메서드 AbstractMethod와 두 개의 추상 속성 XY가 포함되어 있습니다.

// abstract_keyword.cs
// Abstract Classes
using System;
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);
    }
}

출력

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 추상 클래스

참고 항목

참조

한정자(C# 참조)
virtual(C# 참조)
override(C# 참조)
C# 키워드

개념

C# 프로그래밍 가이드

기타 리소스

C# 참조