클래스를 정의할 당시 구체화 시킬 수 없는 기능을 추상적 표현으로 정의하는 겁니다.
abstract class Item
{
public abstract void Use(); // 클래스에서 구현을 진행하지 않고 선언만 진행
}
이렇게 설정을 하면 상속받았을 때 Use()는 확실히 사용해야 오류가 생기지 않습니다.
가장 큰 이유는 부모 클래스의 기능을 구현하지 않고 넘어가는 실수를 줄이기 위해 사용합니다.
해당 추상 클래스를 상속 받은 자식 클래스는 기능을 구체화시키지 않은 경우
인스턴스 생성이 불가능하기 때문에 자식클래스에게 구현을 강제할 수 있습니다.
또 프로젝트 당시에 구현을 구체화하기 어려운 상위클래스를 설계하기 위한 수단으로 사용하기도 합니다.
public abstract class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
public abstract void Walk();
}
public class Dog : Animal
{
public Dog(string name) : base(name) { }
public override void Walk()
{
Console.WriteLine("강아지가 네 발로 걸어요");
}
}
public class Human : Animal
{
public Human(string name) : base(name) { }
public override void Walk()
{
Console.WriteLine("사람이 두 발로 걸어요");
}
static void Main(string[] args)
{
Animal[] animals =
{
new Dog("복돌이"),
new Human("홍길동")
};
foreach (var animal in animals)
{
animal.Walk();
}
}
}
}
강아지가 네 발로 걸어요
사람이 두 발로 걸어요
이렇게 추상 클래스를 상속 받았을 때 해당 클래스의 메서드까지 빠짐없이 기입해야 오류가 나지 않습니다.