추상 클래스란
추상 클래스는 인터페이스와 같이 '구현'을 가질 수 있습니다. 하지만 클래스처럼 인스턴스는 가질 수 없습니다. 추상 클래스는 아래의 문법으로 선언이 가능합니다.
abstract class 클래스이름
{
// 클래스와 동일한 구현부
}
그렇다면 추상 클래스는 인터페이스와 기본 클래스 중 어디에 더 가까울까요? 둘의 한정자를 보면 어디에 가까운지 알 수 있습니다. 인터페이스는 모든 메소드가 Public 으로 선언됩니다. 하지만 클래스는 한정자를 명시하지 않으면 private 로 선언됩니다. 추상 클래스도 이와 마찬가지기에 기본 클래스에 더 가까운 느낌입니다.
추상 클래스는 인스턴스를 만들지 못합니다. 이는 기본 클래스와 다른점입니다. 또 다른 점은 추상 클래스는 추상 메소드를 가질 수 있다는 점입니다. 추상 메소드는 인터페이스의 역할을 해줍니다. 파생 클래스에 메소드의 구현을 강제해주기 때문입니다.
다시 말해, 추상 클래스를 상속받는다면, 추상 클래스에 속한 추상 메서드들이 반드시 구현되리라는 약속을 하게 되는 겁니다.
앞서 말했지만 추상 클래스에 선언되는 모든 여러가지 것들은 접근 한정자를 명시하지 않으면 private 이 됩니다. 하지만 추상 메소드는 약속을 시키는 역할을 하는데 접근 한정자가 꽉 막혀 있으면 안 될 일입니다. 때문에 C# 컴파일러에서 추상 메소드는 public, protected, internal, protected internal 한정자로 수식되길 강요하고 있습니다.
예제 프로그램의 작성
말은 이제 됐고, 예제 프로그램을 작성하여 이해해보겠습니다.
using System;
namespace AbstractClass {
abstract class AbstractBase {
protected void PrivateMethodA()
{
Console.WriteLine("AbstractBase.PrivateMethodA()");
}
public void PublicMethodA()
{
Console.WriteLine("AbstractBase.PublicMethodA()");
}
public abstract void AbstractMethod();
}
class Derived : AbstractBase {
public override void AbstractMethod()
{
Console.WriteLine("Derived.AbstractMethodA()");
PrivateMethodA();
}
}
class Program {
static void Main(string[] args)
{
AbstractBase obj = new Derived();
obj.AbstractMethod();
obj.PublicMethodA();
}
}
}
추상 클래스는 일반 클래스가 가질 수 있는 구현부와 추상 메소드를 통한 약속의 강제까지 가능합니다. 이러한 내용은 프로그래머의 협업간에 "무엇을 상속해서 사용해라" 라는 식의 메뉴얼을 말하지않아도 서로 통하게 만들어줍니다.
출력
정상 출력됩니다.